Async.js常用方法整理之Control Flow

Published: 2015-11-24

Tags: Node.js Async

本文总阅读量
  1. series
  2. parallel
  3. whilst
  4. waterfall

Control Flow (流程控制)

1. series

series(tasks, [callback]) - 按照顺序运行数组中的函数,每一个函数都将执行一次,结果返回到回调中

Template 1

async.series([
   function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    },
    function(callback){
        setTimeout(function(){
            var err = new Error('I am the error');
            callback(err);
        }, 400);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'three');
        }, 600);
    }
],
// optional callback
function(err, results){
    //results is now equal to [ 'one', 'two', undefined ]
    if(err){
        console.log('Error');
    } else {

    }
    console.log(results);
});

Output 1

Error
[ 'one', 'two', undefined ]

2. parallel

parallel(tasks, [callback]) - 并行运行数组中的函数,每一个函数都将执行一次,结果返回到回调中

Template 2

async.parallel([
    function(callback){
        setTimeout(function(){
            callback(null, 'one');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'two');
        }, 100);
    },
    function(callback){
        setTimeout(function(){
            var err = new Error('I am the error');
            callback(err);
        }, 400);
    },
    function(callback){
        setTimeout(function(){
            callback(null, 'three');
        }, 600);
    },
],
// optional callback
function(err, results){
    if(err){
        console.log('Error');
    } else {

    }
    console.log(results);
    //results is now equal to [ 'one', 'two', undefined ]
    // the second function had a shorter timeout.
});

Output 2

Error
[ 'one', 'two', undefined ]

看上的两个函数从结果来看是没有什么不同的,因为无论过程如何,返回的数组内数据都是按照函数的顺序排列的,简单总结如下

  • series 的result产生的顺序是[one] -> [one, two] -> ...
  • parallel 的result产生的顺序是[,two] -> [one, two] -> ...

一般来讲,如果函数相互独立,应优先选用parallel来控制函数运行,因为其更加快速

series与parallel返回对象数据

// an example using an object instead of an array
async.series({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equal to: {one: 1, two: 2}
});
// an example using an object instead of an array
async.parallel({
    one: function(callback){
        setTimeout(function(){
            callback(null, 1);
        }, 200);
    },
    two: function(callback){
        setTimeout(function(){
            callback(null, 2);
        }, 100);
    }
},
function(err, results) {
    // results is now equals to: {one: 1, two: 2}
});

类似于处理数组时并行计算的Limit限制,parallel也有个近似函数,可以设定limit参数

  • parallelLimit(tasks, limit, [callback])

3. whilst

whilst(test, fn, callback) - 测试函数test返回的true,则执行fn函数,最后调用回调函数

Template 3

var count = 0;

async.whilst(
    function () {
      console.log(count);
      return count < 5; },
    function (callback) {
        count++;
        setTimeout(callback, 1000);
    },
    function (err) {
        // 5 seconds have passed
    }
);

Output 3

0
1
2
3
4
5

类似的控制函数还有doWhilst, until, doUntil, during, doDuring, forever 此处不一一举例


4. waterfall

waterfall(tasks, [callback]) - 任务数组中的函数会将本函数的结果传递给下一个函数,有错误产生则终止,并执行回调函数

Template 4

async.waterfall([
    function(callback) {
        callback(null, 'one', 'two');
    },
    function(arg1, arg2, callback) {
      // arg1 now equals 'one' and arg2 now equals 'two'
        callback(null, 'three');
    },
    function(arg1, callback) {
        // arg1 now equals 'three'
        callback(null, 'done');
    }
], function (err, result) {
    // result now equals 'done'
});

最终的result数据将由最后一个函数拼接产生。


暂时先学这么多,以后有需要再看文档,Async官方文档地址:https://github.com/caolan/async