Скажем, мы используем async.map или практически любую из асинхронных утилит.
Мой вопрос / запрос функции: если массив / набор задач пуст, запускает ли async последний обратный вызов на следующем тике? Если нет, есть ли способ сообщить об этом async? Было бы неплохо.
В противном случае у меня много этого в моем коде, который более подробен:
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
все позволяют передавать аргументы, которые будут переданы функции.