JS async库:parallel, series, waterfall, whilst用法

针对JS的异步机制,JS社区给出了很多不同的解决方案,Async库便是其中一种,可能也是对于控制异步操作最全面的资源。因为该库提供了70个函数,几乎想所有的运用场景都考虑在内。以下笔者针对四个函数进行讲解:

1. parallel

const async = require('async');

const doOne = callback => {
    setTimeout(() => {
        callback(null, 'one');
    }, 1000)
}

const doTwo = callback => {
    setTimeout(() => {
        callback(null, 'two');
    }, 1000)
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.parallel(array, (err, result) => {
    console.log(result);
})

//等待1秒后打印:['one', 'two']

Parallel 函数接受两个参数,第一个参数可以是数组也可以是对象。里边需要包括所有需要并行操作的异步函数,以上图为例,笔者将两个异步函数,setTimeout加入队列中,然后放入parallel函数内的第一个参数。需要注意的是每个异步函数需要制定一个固定参数callback进行调用。该函数用来检测任何错误信息和最后传达到parallel第二个参数的result。以上函数的执行结果是在等待一秒之后打印出队列,里面包含了‘one’和'two'两值。如果将以上的array改成一个对象,那result也会是一个对象,并根据传入的键值给结果附上对应的值。

2. series

const async = require('async');

const doOne = callback => {
    setTimeout(() => {
        callback(null, 'one');
    }, 1000)
}

const doTwo = callback => {
    setTimeout(() => {
        callback(null, 'two');
    }, 1000)
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.series(array, (err, result) => {
    console.log(result);
})

//等待2秒后打印:['one', 'two']

以上的代码和parallel几乎一样,唯一改变的是将parallel函数改成series。但执行结果却从1秒变为2秒。Series针对数组的顺序去调用异步函数,只有当第一个函数执行完成后才会调用第二个,所以执行时间会延长到2秒。但一般情况下,如果业务逻辑需要几个异步操作通过顺序进行,那么很有可能排后的函数需要用到先执行函数的结果,而series并没有给出传递参数给下一个函数的功能。在这样的情况,开发者可以用waterfall来解决;

3. waterfall

const doOne = callback => {
    callback(null, "one");
}

const doTwo = (arg, callback) => {
    console.log(arg);
    callback(null, "two");
}

let array = [];
array.push(doOne);
array.push(doTwo);

async.waterfall(array, (err, result) => {
    console.log(result);
})

//one
//two

跟其他函数不同waterfall会将数组里第一个函数传入callback的值传递给下一个函数。doTwo里面的console.log会打印doOne传入的“one”,而waterfall里的回调会打印doTwo传入的“two”。

4. whilst

var count = 0;
async.whilst(
    function() { return count < 10; },
    function(callback) {
        count++;
        console.log(count);
        setTimeout(function() {
            callback(null, count);
        }, 500);
    },
    function (err, n) {
        console.log('done');
    }
);

whilst跟以上三个函数不同,该操作不是针对数组或者对象内的顺序进行异步调用,而是针对在某种条件下执行异步操作。whilst接受三个参数,第一个为判断函数,只有在该函数返回true时,第二个参数参会执行。第二个参数便是表达核心逻辑的函数。第三个则是第一个参数返回false之后的回调函数。在上面的例子中,whilst控制住了count的打印速度,会在每半秒打印出一次count。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
async waterfall 是 async 中的一个函数,它的作用是串行执行一组异步函数,每个函数产生的结果都将传递给下一个函数。下面是 async waterfall 的详细用法: ```javascript async.waterfall([ function(callback) { // 第一个异步函数 callback(null, 'one', 'two'); }, function(arg1, arg2, callback) { // 第二个异步函数 callback(null, 'three'); }, function(arg1, callback) { // 第三个异步函数 callback(null, 'done'); } ], function(err, result) { // 最终回调函数 console.log(result); }); ``` 在这个例子中,我们定义了三个异步函数,它们将按照顺序依次执行。每个函数的第一个参数都是上一个函数的结果,第二个参数是一个回调函数,用于传递当前函数的结果给下一个函数。在最后一个函数执行完之后,最终回调函数会被调用,它的第一个参数是可能出现的错误,第二个参数是最后一个函数的结果。 需要注意的是,如果某个异步函数产生了错误,那么它的结果会被传递给最终回调函数的第一个参数,而不是传递给下一个函数。因此,在每个异步函数中,需要通过传递一个非空的 error 参数来表示错误的发生。例如: ```javascript async.waterfall([ function(callback) { // 第一个异步函数 callback(new Error('Something went wrong'), null); }, function(arg1, arg2, callback) { // 第二个异步函数 callback(null, 'three'); } ], function(err, result) { // 最终回调函数 if (err) { console.error(err); } else { console.log(result); } }); ``` 在这个例子中,第一个异步函数产生了一个错误,并将其传递给回调函数。在最终回调函数中,我们检查第一个参数是否为非空的 error 对象,如果是,就打印出错误信息,否则打印出最后一个函数的结果。 总之,async waterfall 是一个非常有用的工具,可以帮助我们串行执行一组异步函数,提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值