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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs npm package.json中文文档
Sep 04 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
详解nodejs模板引擎制作
Jun 14 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 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
DOM XPATH获取img src值的query
2013/09/23 PHP
PDO防注入原理分析以及注意事项
2015/02/25 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
php中bind_param()函数用法分析
2017/03/28 PHP
laravel5.6实现数值转换
2019/10/23 PHP
jquery 新浪网易的评论块制作
2010/07/01 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
JavaScript将Table导出到Excel实现思路及代码
2013/03/13 Javascript
web网页按比例显示图片实现原理及js代码
2013/08/09 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
每天一篇javascript学习小结(基础知识)
2015/11/10 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
React Router基础使用
2017/01/17 Javascript
react实现pure render时bind(this)隐患需注意!
2017/03/09 Javascript
js实现抽奖效果
2017/03/27 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
vuex 项目结构目录及一些简单配置介绍
2018/04/08 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
JS实现可切换图片的幻灯切换效果示例
2019/05/24 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
vue-resource post数据时碰到Django csrf问题的解决
2020/03/13 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
python中常用的九种预处理方法分享
2016/09/11 Python
Python数据结构之图的应用示例
2018/05/11 Python
python的pstuil模块使用方法总结
2019/07/26 Python
python函数参数(必须参数、可变参数、关键字参数)
2019/08/16 Python
pytorch 多分类问题,计算百分比操作
2020/07/09 Python
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
大学毕业生自荐书怎么写?
2014/01/06 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
《观潮》教学反思
2016/02/17 职场文书
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers