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' ] } */