async.js中waterfall、series、parallel的区别

阅读更多
test_waterfall1.js
var async = require('async'); 

// waterfall Test 1
// 参数: task数组、task全部完成后的最终函数.
//   将数组中的task按顺序执行,没有调用callback的话不会执行下一个task
//   callback 第一个参数是error,第二个以后的参数传递给下一个task
async.waterfall([
    function(callback) {
        console.log("---------- task 1 ----------");
        callback(null, '111', '222');
    },
    function(arg1, arg2, callback) {
        console.log("---------- task 2 ----------");
        console.log("arg1=" + arg1 + " arg2=" + arg2);
        callback(null, '333');
    },
    function(arg3, callback) {
        console.log("---------- task 3 ----------");
        console.log("arg3=" + arg3);
        callback(null, '444');
    }
], function (err, result) {
    if (err) {
        console.log("something is wrong");
    } else {
        console.log("all the functions have completed");
    }
    console.log("err=" + err);
    console.log("result=" + result);
});

/*
D:\asyncsample>node test_waterfall1.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
---------- task 3 ----------
arg3=333
all the functions have completed
err=null
result=444
*/


test_waterfall2.js
var async = require('async'); 

// waterfall Test 2
// callback 第一个参数如果不为null,将跳过之后的所有task直接执行最终函数
async.waterfall([
    function(callback) {
        console.log("---------- task 1 ----------");
        callback(null, '111', '222');
    },
    function(arg1, arg2, callback) {
        console.log("---------- task 2 ----------");
        console.log("arg1=" + arg1 + " arg2=" + arg2);
        callback("ERROR TEST", '333'); // !!!!!pass an error to callback, the next function is not executed
    },
    function(arg3, callback) {
        console.log("---------- task 3 ----------");
        console.log("arg3=" + arg3);
        callback(null, '444');
    }
], function (err, result) {
    if (err) {
        console.log("something is wrong");
    } else {
        console.log("all the functions have completed");
    }
    console.log("err=" + err);
    console.log("result=" + result);
});

/*
D:\asyncsample>node test_waterfall2.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
something is wrong
err=ERROR TEST
result=333
*/


test_waterfall3.js
var async = require('async'); 

// waterfall Test 3
// 如果某个task中没有调用下一个task,以后的所有处理都不会被执行(包括最终函数)
async.waterfall([
    function(callback) {
        console.log("---------- task 1 ----------");
        callback(null, '111', '222');
    },
    function(arg1, arg2, callback) {
        console.log("---------- task 2 ----------");
        console.log("arg1=" + arg1 + " arg2=" + arg2);
        //callback(null, '333'); // !!!
    },
    function(arg3, callback) {
        console.log("---------- task 3 ----------");
        console.log("arg3=" + arg3);
        callback(null, '444');
    }
], function (err, result) {
    if (err) {
        console.log("something is wrong");
    } else {
        console.log("all the functions have completed");
    }
    console.log("err=" + err);
    console.log("result=" + result);
});

/*
D:\asyncsample>node test_waterfall3.js
---------- task 1 ----------
---------- task 2 ----------
arg1=111 arg2=222
*/


test_waterfall.js
var async = require('async'); 

// waterfall
// http://caolan.github.io/async/docs.html#waterfall
async.waterfall([
    function(callback) {
        console.log("---------- task 1 ----------");
        setTimeout(function() {
            console.log('task 1 done');
            callback(null, '111', '222');
        }, 100);
    },
    function(arg1, arg2, callback) {
        console.log("---------- task 2 ----------");
        console.log("arg1=" + arg1 + " arg2=" + arg2);
        setTimeout(function() {
            console.log('task 2 done');
            callback(null, '333');
        }, 50);
    },
    function(arg3, callback) {
        console.log("---------- task 3 ----------");
        console.log("arg3=" + arg3);
        setTimeout(function() {
            console.log('task 3 done');
            callback(null, '444');
        }, 10);
    }
], function (err, result) {
    console.log("---------- all done ----------");
    console.log("err=" + err);
    console.log("result=" + result);
});

/*
D:\asyncsample>node test_waterfall.js
---------- task 1 ----------
task 1 done
---------- task 2 ----------
arg1=111 arg2=222
task 2 done
---------- task 3 ----------
arg3=333
task 3 done
---------- all done ----------
err=null
result=444
*/


test_series.js
var async = require('async'); 

// series
// http://caolan.github.io/async/docs.html#series
// 和watarfall相同,也是按顺序执行数组里的task,没有调用到callback不会执行下一个task
// 不同的是:所有的task只有一个参数callback。所有往下传递的参数都会被放入最终函数的数组results里
async.series([
    function(callback) {
        console.log("---------- task 1 ----------");
        setTimeout(function() {
            console.log('task 1 done');
            callback(null, '111', '222');
        }, 100);
    },
    function(callback) {
        console.log("---------- task 2 ----------");
        setTimeout(function() {
            console.log('task 2 done');
            callback(null, '333');
        }, 50);
    },
    function(callback) {
        console.log("---------- task 3 ----------");
        setTimeout(function() {
            console.log('task 3 done');
            callback(null, '444');
        }, 10);
    }
], function (err, results) {
    console.log("---------- all done ----------");
    console.log("err=" + err);
    console.log(results);
});

/*
D:\asyncsample>node test_series.js
---------- task 1 ----------
task 1 done
---------- task 2 ----------
task 2 done
---------- task 3 ----------
task 3 done
---------- all done ----------
err=undefined
[ [ '111', '222' ], '333', '444' ]
*/


test_parallel.js
var async = require('async'); 

// parallel
// http://caolan.github.io/async/docs.html#parallel
// 和series/waterfall不同,task是并列执行的,callback不是执行下一个task。
//  和series一样,参数都会被放入最终函数的数组results里
async.parallel([
    function(callback) {
        console.log("---------- task 1 ----------");
        setTimeout(function() {
            console.log('task 1 done');
            callback(null, '111', '222');
        }, 100);
    },
    function(callback) {
        console.log("---------- task 2 ----------");
        setTimeout(function() {
            console.log('task 2 done');
            callback(null, '333');
        }, 50);
    },
    function(callback) {
        console.log("---------- task 3 ----------");
        setTimeout(function() {
            console.log('task 3 done');
            callback(null, '444');
        }, 10);
    }
], function (err, results) {
    console.log("---------- all done ----------");
    console.log("err=" + err);
    console.log(results);
});

/*
D:\asyncsample>node test_parallel.js
---------- task 1 ----------
---------- task 2 ----------
---------- task 3 ----------
task 3 done
task 2 done
task 1 done
---------- all done ----------
err=undefined
[ [ '111', '222' ], '333', '444' ]
*/


test_parallel_obj.js
var async = require('async'); 

// parallel
// 并行处理的第一个参数可以是一个对象,最终函数的参数也不是数组而是一个带key的对象
async.parallel({
    first: function(callback) {
        console.log("---------- task 1 ----------");
        setTimeout(function() {
            console.log('task 1 done');
            callback(null, '111', '222');
        }, 100);
    },
    second: function(callback) {
        console.log("---------- task 2 ----------");
        setTimeout(function() {
            console.log('task 2 done');
            callback(null, '333');
        }, 50);
    },
    third: function(callback) {
        console.log("---------- task 3 ----------");
        setTimeout(function() {
            console.log('task 3 done');
            callback(null, '444');
        }, 10);
    }
}, function (err, result) {
    console.log("---------- all done ----------");
    console.log("err=" + err);
    console.log(result);
});

/*
D:\asyncsample>node test_parallel_obj.js
---------- task 1 ----------
---------- task 2 ----------
---------- task 3 ----------
task 3 done
task 2 done
task 1 done
---------- all done ----------
err=undefined
{ third: '444', second: '333', first: [ '111', '222' ] }
*/
  • asyncsample.zip (4.4 KB)
  • 下载次数: 0

你可能感兴趣的:(async.js中waterfall、series、parallel的区别)