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 模块开发及发布详解分享
Mar 07 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
详解Nodejs的timers模块
Dec 22 NodeJs
详解Nodejs之npm&package.json
Jun 15 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
Nodejs异步流程框架async的方法
Jun 07 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 NodeJs
nodejs中的异步编程知识点详解
Jan 17 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教程 插件机制在PHP中实现方案
2012/11/02 PHP
如何让CI框架支持service层
2014/10/29 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
jQuery参数列表集合
2011/04/06 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
2013/03/11 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
详解JS: reduce方法实现 webpack多文件入口
2017/02/14 Javascript
详解vue-cli+es6引入es5写的js(两种方法)
2019/04/19 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
JS+Canvas实现五子棋游戏
2020/08/26 Javascript
python控制台英汉汉英电子词典
2020/04/23 Python
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
python使用正则表达式来获取文件名的前缀方法
2018/10/21 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python Tkinter的图片刷新实例
2019/06/14 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
python安装pil库方法及代码
2019/06/25 Python
python基于gevent实现并发下载器代码实例
2019/11/01 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
HTML5本地存储之Web Storage应用介绍
2013/01/06 HTML / CSS
戴尔英国官网:Dell英国
2017/05/27 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
应届生护士求职信
2013/11/01 职场文书
办公室文书岗位职责
2013/12/16 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
服务之星事迹材料
2014/05/03 职场文书
正风肃纪查摆剖析材料
2014/10/10 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
python基础学习之生成器与文件系统知识总结
2021/05/25 Python