В чем разница между async.waterfall и async.series


Ответы:


168

Похоже, что это async.waterfallпозволяет каждой функции передавать свои результаты следующей функции, а async.seriesвсе результаты - конечному обратному вызову. На более высоком уровне async.waterfallэто будет для конвейера данных («дано 2, умножить на 3, добавить 2 и разделить на 17»), а async.seriesдля дискретных задач, которые должны выполняться по порядку, но в остальном являются отдельными.


Может ли какая-либо из этих двух функций вернуть значение? Я читал, что это возможно, но нигде в документации не могу найти соответствующей информации.
Андерсон Грин

1
@AndersonGreen: Нет. Глядя на исходный код библиотеки, значение не возвращается и waterfallне seriesвозвращается. Ожидается, что какой бы результат ни был, он будет использован в необязательном параметре обратного вызова.
Twisol

Вышеупомянутый ответ может быть правильным до 2012 года, но правильный тот же, что и следующий, а именно: series (), поскольку он назван, что ВСЕ результаты в виде серии переданы в обратный вызов Final, а водопад - это ПОСЛЕДНИЙ результат, переданный в Последний обратный вызов. См. Mozilla Developer
Jeb50,

53

Обе функции передают возвращаемое значение каждой функции следующей, а затем, когда это сделано, вызовут основной обратный вызов, передав его ошибку, если произойдет ошибка.

Разница в том async.series(), что после завершения серии все результаты передаются в основной обратный вызов. async.waterfall()передаст основному обратному вызову только результат последней вызванной функции.


1
Это должно быть ответом ;-)
Стюарт Аллен

@Mario "Обе функции передают обратный вызов предыдущей функции" ИЛИ "Обе функции передают результат предыдущей функции"?
user1451111

@ user1451111, Результат, лол ... Я уверен, что написал это в первый раз ...

26

async.waterfall()имеет дело с action that relies on the previous outcome.

async.series() имеет дело с действием, которое хочет see all the result at the end


1
Потрясающе созданные изображения. Вы создали их сами или получили где-то еще?
user1451111

Вы должны поместить изображения в ответ, люди, вероятно, будут скучать по ним в / в
Александр Миллс

1

Я считаю async.waterfall вредным, потому что его сложно реорганизовать после написания, а также он подвержен ошибкам, поскольку, если вы предоставите больше аргументов, другие функции сильно изменят подпись.

Я настоятельно рекомендую async.autoInjectasync.waterfall в качестве отличной альтернативы. https://caolan.github.io/async/autoInject.js.html

Если вы все же решите использовать async.waterfall, я рекомендую хранить все в одном объекте, чтобы вашим функциям не приходилось изменять длину / подписи, например:

предупреждение: это плохой шаблон

async.waterfall([
  cb => {
    cb(null, "one", "two");
  },
  (one, two, cb) => {
    cb(null, 1, 2, 3, 4);
  },
  (one,two,three,four,cb) => {
     // ...
  }
])

не делайте этого вышеописанным способом. Это гораздо лучший шаблон для использования:

async.waterfall([
  cb => {
    cb(null, {one:"one", two:"two"});
  },
  (v, cb) => {
    cb(null, [1, 2, 3, 4]);
  },
  (v,cb) => {
     // ...
  }
])

таким образом вы не будете выдергивать волосы, пытаясь убедиться, что аргументы функции имеют правильную длину. Первая функция принимает только один аргумент - обратный вызов. Все остальные должны принимать два аргумента - значение и обратный вызов. Придерживайтесь шаблона, и вы останетесь в здравом уме!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.