有用的代码块-第03章-Async进行流程控制

Async 模块是 NodeJS 的一个 module,主要用于流程控制。

参考:https://caolan.github.io/async/docs.html

抑或老版本参考:https://github.com/caolan/async/blob/v1.5.2/README.md

串行操作: Async.series

async,series(tasks, final)

使用方法:

// 令todos列表函数依次执行
async.series(todos, (err, data) => {
    // 得到err与data结果
    // todos是函数数组: data为结果数组
    // todos是函数字典: data为结果字典
});

例如:

async.series([
    function(next) {next(null, data1);},
    function(next) {next(null, data2);}...
], (err, data) => {
    // data is [data1, data2]
});

async.series({
    func1: function(next) {next(null, data1);},
    func2: function(next) {next(null, data2);}...
}, (err, data) => {
    // data is {func1: data1, func2: data2}
});

瀑布操作: Async.waterfall

async,waterfall(tasks, final)

使用方法:

// 令todos列表依次执行, 并且上面函数将执行结果传入下面函数, 最后函数只得到最终结果
async.waterfall(todos, (err, data) => {
    // 得到err与data结果
});

例如:

async.waterfall([
    function(next) {next(null, data1)},
    function(data1, next) {
        // data1 是上一个函数传入的参数, 如果上一个函数报错, 则不走本函数, 直接进入最终回调函数
        next(null, data2);
    }...
], function(err, datan){
    // datan 是最后一个 next(err, datan); 中传入的参数
});

并行操作 Async.parallel

async,parallel(tasks, final)

使用方法:

// 令todos列表并行执行, 总执行时间是所有函数中最慢的一个
async.parallel(todos, (err, data) => {
    // 得到err与data结果
    // todos是函数数组: data为结果数组
    // todos是函数字典: data为结果字典
});

使用方法与 series 完全相同,只是 series 表示顺序执行,parallel 表示并行执行.

限制性并行 Async.parallelLimit

async.parallelLimit(tasks, limitNum, final)

limitNum 为Number类型, 表示同时最大执行任务数

循环流程控制

async.whilst(testTureFn, fn, next)

如果 testTureFn 返回真, 则执行 fn 一次, 如果 testTrueFn 返回假, 则执行 next

async.doWhilst(fn, testTrueFn, next)

先执行一次 fn, 然后验证 testTrueFn 为真继续执行 fn, 否则执行 next

类似还有 async.until , async.doUntil

队列流程控制 Async.queue

// 创建队列
let queue = async.queue((task, next) => {
    // task 就是队列中待处理的数据
    // 执行结束后结束任务
    next();
    // Worker Num 就是队列中消费者的个数
}, workerNum);

// 创建队列监听函数
queue.empty = function() { console.log("execute when queue is empty, maybe some work is still been doing by some worker."); };
queue.drain = function() { console.log("execute when all work done"); };

// 向队列写入内容
queue.push(data, (err) => { console.log("data executed"); });

请注意Async.queueAsync.parallel的区别与不同的使用情境.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.