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 相关文章推荐
windows系统下简单nodejs安装及环境配置
Jan 08 NodeJs
跟我学Nodejs(三)--- Node.js模块
May 25 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
Nodejs学习笔记之Stream模块
Jan 13 NodeJs
nodejs爬虫遇到的乱码问题汇总
Apr 07 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
配置nodejs环境的方法
May 13 NodeJs
理解nodejs的stream和pipe机制的原理和实现
Aug 12 NodeJs
NodeJs实现定时任务的示例代码
Dec 05 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
node快速搭建后台的实现步骤
Feb 18 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中foreach/in_array的使用
2015/11/02 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
写自已的js类库需要的核心代码
2012/07/16 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
深入浅析JavaScript函数前面的加号和叹号
2016/07/09 Javascript
微信小程序 页面跳转传参详解
2016/10/28 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
Vue组件跨层级获取组件操作
2020/07/27 Javascript
vuejs实现下拉框菜单选择
2020/10/23 Javascript
python字典多键值及重复键值的使用方法(详解)
2016/10/31 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
scrapy实践之翻页爬取的实现
2021/01/05 Python
详解CSS3 用border写 空心三角箭头 (两种写法)
2017/09/29 HTML / CSS
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
美国台面电器和厨具品牌:KitchenAid
2019/04/12 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
寒假思想汇报
2014/01/10 职场文书
入党申请自荐书范文
2014/02/11 职场文书
常务副总经理任命书
2014/06/05 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
求职信格式范文
2015/03/19 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android