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基本语法和类型
Feb 13 NodeJs
深入浅析NodeJs并发异步的回调处理
Dec 21 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodejs利用ajax实现网页无刷新上传图片实例代码
Jun 06 NodeJs
详解nodejs中express搭建权限管理系统
Sep 15 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
nodejs取得当前执行路径的方法
May 13 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJS 文件夹拷贝以及删除功能
Sep 03 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
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php实现只保留mysql中最新1000条记录
2015/06/18 PHP
PHP简单实现断点续传下载的方法
2015/09/25 PHP
php格式文件打开的四种方法
2018/02/24 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
jQuery点击后一组图片左右滑动的实现代码
2012/08/16 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
IE6 hack for js 集锦
2014/09/23 Javascript
js中日期的加减法
2015/05/06 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
React实现todolist功能
2020/12/28 Javascript
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python正则简单实例分析
2017/03/21 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
Python程序暂停的正常处理方法
2019/11/07 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
python归并排序算法过程实例讲解
2020/11/04 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
电子商务优秀毕业生求职信
2014/07/11 职场文书
2014年民政工作总结
2014/11/26 职场文书
监察建议书
2015/02/04 职场文书
2015学校师德师风工作总结
2015/04/22 职场文书
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫