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中实现路由功能
Dec 29 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
配置nodejs环境的方法
May 13 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
NodeJS使用Range请求实现下载功能的方法示例
Oct 12 NodeJs
详解nodejs 配置文件处理方案
Jan 02 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
Nodejs实现WebSocket代码实例
May 19 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 _autoload自动加载类与机制分析
2012/02/10 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
用js实现简单算法的实例代码
2016/09/24 Javascript
react-router实现按需加载
2017/05/09 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
通过实例解析js简易模块加载器
2019/06/17 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
基于vue-draggable 实现三级拖动排序效果
2020/01/10 Javascript
python解析中国天气网的天气数据
2014/03/21 Python
python实现excel读写数据
2021/03/02 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
解决Django加载静态资源失败的问题
2019/07/28 Python
Python datetime 如何处理时区信息
2020/09/02 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
美国在线乐器和设备商店:Musician’s Friend
2018/07/06 全球购物
策划主管的工作职责
2013/11/24 职场文书
环境科学专业个人求职信
2013/12/15 职场文书
社区食品安全实施方案
2014/03/28 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
统招统分证明
2015/06/23 职场文书
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python