Async: 功能/支持 - 空任务集 -> 在下一次滴答时自动触发最终回调?

创建于 2017-04-13  ·  3评论  ·  资料来源: caolan/async

假设我们正在使用 async.map 或几乎任何异步实用程序

我的问题/功能请求是 - 如果任务数组/集为空,异步会在下一个滴答声中触发最终回调吗? 如果没有,有没有办法告诉异步这样做? 将是一个不错的功能。
否则,我的代码中有很多这样的内容,这更冗长:

async.map([], function(item,cb){

}, function final(err, results){
    process.next(function(){ 
      cb(err,results);
   });
});

为避免 Zalgo,以上是必要的,但是,这样做更好:

async.map([], function(item,cb){

}, cb);

我想我们可以做的一件事是检查数组是否为空,如果是,请尽早返回

if(![].length){
   return process.next(cb);
}

你推荐什么?

question

最有用的评论

是的, @hargasinski有钱。 出于性能原因,我们不会保护您免受 Zalgo 的侵害。

您可以做的一种简化是:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate都允许您传递将传递给函数的参数。

所有3条评论

@ORESoftware ,感谢您的提问! 对于空数组/集, async在同一滴答上调用最终回调,因为出于性能原因在v2.0.0中删除了内置延迟(我不认为async < v2.0.0甚至在这种情况下也有一个内置的延期)。

一个简单的解决方法是将async.map包装在async.ensureAsync

async.ensureAsync(async.map)([], function(item, cb) {

}, cb);

或代码开头的某处:

const asyncMap = async.ensureAsync(async.map);
// then call `asyncMap` just as you would `async.map`

否则,您提出的process.nextTick方法是完全有效的。 不过,如果您正在编写可能在浏览器中使用的代码,您应该查看async.setImmediateasync.nextTick

是的, @hargasinski有钱。 出于性能原因,我们不会保护您免受 Zalgo 的侵害。

您可以做的一种简化是:

function final(err, results){
    process.nextTick(cb, err, results);
}

async.nextTick / async.setImmediate / process.nextTick / setImmediate都允许您传递将传递给函数的参数。

哦,太好了,我不知道 process.nextTick 等,太棒了

此页面是否有帮助?
0 / 5 - 0 等级