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微信公众号支付开发
Sep 19 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
nodejs搭建本地服务器并访问文件的方法
Mar 03 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
深入浅析Nodejs的Http模块
Jun 20 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 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的错误信息
2006/10/09 PHP
php设计模式小结
2013/02/15 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
javascript基本语法分析说明
2008/06/15 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
jquery提交form表单时禁止重复提交的方法
2014/02/13 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
基于jQuery中ajax的相关方法汇总(必看篇)
2017/11/08 jQuery
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
[17:45]DOTA2 HEROES教学视频教你分分钟做大人-军团指挥官
2014/06/11 DOTA
Python中使用PyQt把网页转换成PDF操作代码实例
2015/04/23 Python
Python简单进程锁代码实例
2015/04/27 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
keras.utils.to_categorical和one hot格式解析
2020/07/02 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
物流管理专业推荐信
2014/09/06 职场文书
优秀党员先进材料
2014/12/18 职场文书
老人院义工活动感想
2015/08/07 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
判断Python中的Nonetype类型
2021/05/25 Python
opencv检测动态物体的实现
2021/07/21 Python
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android