假设我们正在使用 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);
}
你推荐什么?
嘿@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.setImmediate
或async.nextTick
。
是的, @hargasinski有钱。 出于性能原因,我们不会保护您免受 Zalgo 的侵害。
您可以做的一种简化是:
function final(err, results){
process.nextTick(cb, err, results);
}
async.nextTick
/ async.setImmediate
/ process.nextTick
/ setImmediate
都允许您传递将传递给函数的参数。
哦,太好了,我不知道 process.nextTick 等,太棒了
最有用的评论
是的, @hargasinski有钱。 出于性能原因,我们不会保护您免受 Zalgo 的侵害。
您可以做的一种简化是:
async.nextTick
/async.setImmediate
/process.nextTick
/setImmediate
都允许您传递将传递给函数的参数。