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

[b]test_waterfall1.js[/b]
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
*/


[b]test_waterfall2.js[/b]
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
*/


[b]test_waterfall3.js[/b]
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
*/


[b]test_waterfall.js[/b]
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
*/


[b]test_series.js[/b]
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' ]
*/


[b]test_parallel.js[/b]
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' ]
*/


[b]test_parallel_obj.js[/b]
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' ] }
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值