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的url截取模块url-extract的使用实例
Nov 18 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
nodejs学习笔记之路由
Mar 27 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
详解webpack打包nodejs项目(前端代码)
Sep 19 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
Nodejs实现微信分账的示例代码
Jan 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设计模式 State (状态模式)
2011/06/26 PHP
php中并发读写文件冲突的解决方案
2013/10/25 PHP
destoon数据库表说明汇总
2014/07/15 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
用JQUERY增删元素的代码
2012/02/14 Javascript
JS+css 图片自动缩放自适应大小
2013/08/08 Javascript
jQuery过滤选择器:not()方法使用介绍
2014/04/20 Javascript
js 左右悬浮对联广告特效代码
2014/12/12 Javascript
node.js中的fs.lstat方法使用说明
2014/12/16 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
vue数据双向绑定的注意点
2017/06/23 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
Node+OCR实现图像文字识别功能
2018/11/26 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
vue项目实现多语言切换的思路
2020/09/17 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
Python中isnumeric()方法的使用简介
2015/05/19 Python
浅谈Python中的闭包
2015/07/08 Python
详解Python下载图片并保存本地的两种方式
2019/05/15 Python
Python: glob匹配文件的操作
2020/12/11 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
医学院四年学习生活的自我评价
2013/11/06 职场文书
董事长秘书岗位职责
2013/11/29 职场文书
批评与自我批评材料
2014/02/15 职场文书
给学校建议书范文
2014/05/13 职场文书
大学生毕业评语
2014/12/31 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
解析Java异步之call future
2021/06/14 Java/Android
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS