Nodejs异步流程框架async的方法


Posted in NodeJs onJune 07, 2019

Async的简单介绍:

Async是一个流程控制工具包,提供了直接而强大的异步功能。基于Javascript为Node.js设计,同时也可以直接在浏览器中使用。Async提供了大约20个函数,包括常用的map, reduce, filter, forEach等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。

https://github.com/caolan/async

我们常用的是以下四种:

  • 串行无关联
  • 串行有关联
  • 并行无关联
  • 智能控制

1.async.series:串行无关联:

多个函数或方法要依次执行,但是他们之间并没有什么联系,只有先后的顺序,比如我要写一个文件,写完之后像用户发送邮件,这两者之间没有必然的联系,但是发邮件必须在写文件完成之后。
async里有一个方法series可以实现这一流程,代码实现如下:

var async = require('async');
console.time('series');
async.series({
  one: function(callback) {
    callback(null, 'one');//callback('i am err','one');异常处理
  },
  two: function(callback) {
    callback(null, 'two');

  },
}, function(error, result) {
  //最后结果
  console.log('error: ' + error);
  console.log('result: ' + result);
  console.timeEnd('series');
});

// error: null
// result: [object Object]
// series: 4.472ms

2.async.waterfall:串行有关联

瀑布流函数,串行执行数组中的每一个函数最后执行回调。 语法:async.waterfall(tasks,callback) 第一个参数tasks是一个数组,数组包含的是需要依次执行的函数。

第二个参数为回调函数,当瀑布流函数(即tasks数组中的函数)执行出现错误时会执行这个回调函数并将错误信息返回,当瀑布流函数无错误时,会在执行完tasks数组中包含的函数后执行这个回调函数。

用法示例: 一般用法:

async.waterfall([
  myFirstFun,
  mySecondFun,
  myLastFun
],function(err,result) { // result回调函数
  // result 相当于tasks数组中最后一个函数(myLastFun)的返回值done
  console.log(result);  // myLastFun
})
function myFirstFun(callback) {
  callback(null,'one','two');
}
function mySecondFun(arg1,arg2,callback) {
  // arg1 相当于 'one' ,arg2 相当于 'two'
  callback(null,'three');
}
function myLastFun(arg1,callback) {
  // arg1 相当于 'three'
  callback(null,'done');
}

3.async.parallel:并行无关联

task并行运行函数集合,而不必等到上一个函数完成。如果任何函数发生错误,会立刻执行回调函数,并返回错误信息;若没有发生错误,则会再所有tasks函数执行完毕之后用回掉函数将结果返回。

语法:async.parallel(tasks,callback) 代码示例:

async.parallel([
  function(callback) {
    setTimeout(function() {
      callback(null, 'one');
    }, 200);
  },
  function(callback) {
    setTimeout(function() {
      callback(null, 'two');
    }, 100);
  }
],function(err, results) {
  console.log(result)}
);

4.async.auto:智能控制

以上都是纯串行传并行,但是当一个场景里,需要使用串行也需要使用并行的时候,虽然分别写能解决,但是效率不是很高,维护性也不是很好,auto可以解决这一问题。

如下场景:

  • 从某处取得数据
  • 在硬盘上建立一个新的目录
  • 将数据写入到目录下某文件
  • 发送邮件,将文件以附件形式发送给其它人。
  • 可以知道1与2可以并行执行,3需要等1和2完成,4要等3完成。
  • 使用auto来解决
var async = require('async');
console.time('auto');
async.auto({
  getData: function(callback) {
    setTimeout(function() {
      console.log('1.1: got data');
      callback(null, 'mydata');
    }, 300);
  },
  makeFolder: function(callback) {
    setTimeout(function() {
      console.log('1.1: made folder');
      callback(null, 'myfolder');
    }, 200);
  },
  writeFile: ['getData', 'makeFolder', function(callback) {
    setTimeout(function() {
      console.log('1.1: wrote file');
      callback(null, 'myfile');
    }, 300);
  }],
  emailFiles: ['writeFile', function(callback, results) {
    console.log('emailed file: ', results.writeFile);
    callback(null, results.writeFile);
  }]
}, function(err, results) {
  console.log('err: ', err);
  console.log('results: ', results);
  console.timeEnd('auto');
});

结果如下

1.1: made folder
1.1: got data
1.1: wrote file
emailed file:  myfile
err:  null
results:  { makeFolder: 'myfolder',
  getData: 'mydata',
  writeFile: 'myfile',
  emailFiles: 'myfile'
}
auto: 650.972ms

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
nodejs教程之异步I/O
Nov 21 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs个人博客开发第一步 准备工作
Apr 12 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
nodeJS服务器的创建和重新启动的实现方法
May 12 NodeJs
nodejs制作小爬虫功能示例
Feb 24 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 NodeJs
nodejs log4js 使用详解
May 31 #NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 #NodeJs
nodejs中实现修改用户路由功能
May 24 #NodeJs
nodejs实现用户登录路由功能
May 22 #NodeJs
基于nodejs的微信JS-SDK简单应用实现
May 21 #NodeJs
nodejs中实现用户注册路由功能
May 20 #NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 #NodeJs
You might like
ueditor 1.2.6 使用方法说明
2013/07/24 PHP
php 中文字符串首字母的获取函数分享
2013/11/04 PHP
php绘制一条直线的方法
2015/01/24 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
Enter转换为Tab的小例子(兼容IE,Firefox)
2013/11/14 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
js闭包引起的事件注册问题介绍
2016/03/29 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
js省市区级联查询(插件版&无插件版)
2017/03/21 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
Vue.js中兄弟组件之间互相传值实例
2017/06/01 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
vue实现购物车小案例
2019/09/27 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
PyCharm配置mongo插件的方法
2018/11/30 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
使用django的objects.filter()方法匹配多个关键字的方法
2019/07/18 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
ET Mall东森购物网:东森严选
2017/03/06 全球购物
大队干部竞选演讲稿
2014/04/28 职场文书
自主招生学校推荐信
2014/09/26 职场文书
六一儿童节开幕词
2015/01/29 职场文书
销售助理岗位职责
2015/02/11 职场文书