Async: Функция / поддержка - Пустой набор задач -> последний обратный вызов автоматически запускается при следующем тике?

Созданный на 13 апр. 2017  ·  3Комментарии  ·  Источник: caolan/async

Скажем, мы используем 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);
}

что вы рекомендуете?

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.setImmediate или async.nextTick .

Да, у @hargasinski есть деньги. Мы не защищаем вас от Zalgo по соображениям производительности.

Вы можете сделать одно упрощение:

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

async.nextTick / async.setImmediate / process.nextTick / setImmediate все позволяют передавать аргументы, которые будут переданы функции.

О, хорошо, я не знал, что о process.nextTick и т. Д., Это круто

Была ли эта страница полезной?
0 / 5 - 0 рейтинги