欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Nodejs异步流程框架async的方法

程序员文章站 2022-06-17 10:06:41
async的简单介绍: async是一个流程控制工具包,提供了直接而强大的异步功能。基于javascript为node.js设计,同时也可以直接在浏览器中使用。asy...

async的简单介绍:

async是一个流程控制工具包,提供了直接而强大的异步功能。基于javascript为node.js设计,同时也可以直接在浏览器中使用。async提供了大约20个函数,包括常用的map, reduce, filter, foreach等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等。

我们常用的是以下四种:

  • 串行无关联
  • 串行有关联
  • 并行无关联
  • 智能控制

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。