Модуль асинхронізації nodejs: https://github.com/caolan/async надає 2 подібних методу async.waterfall
та async.series
.
У чому різниця між ними?
Модуль асинхронізації nodejs: https://github.com/caolan/async надає 2 подібних методу async.waterfall
та async.series
.
У чому різниця між ними?
Відповіді:
Здається, що async.waterfall
кожна функція дозволяє передати свої результати наступній функції, в той час як async.series
передає всі результати до остаточного зворотного виклику. На більш високому рівні це async.waterfall
було б для конвеєра даних ("задано 2, помножте його на 3, додайте 2 і розділіть на 17"), тоді async.series
як для дискретних завдань, які повинні виконуватися в порядку, але інакше є окремими.
waterfall
не series
повертає. Очікується, що незалежно від результату буде використано опціональний параметр зворотного виклику.
Обидві функції передають повернене значення кожної функції наступній, тоді після завершення буде викликати основний зворотний виклик, передаючи його помилку, якщо помилка трапиться.
Різниця полягає в тому async.series()
, що після закінчення серії передадуть усі результати до основного зворотного виклику. async.waterfall()
перейде до основного зворотного дзвінка лише результат останньої викликаної функції.
async.waterfall()
має справу з action that relies on the previous outcome
.
async.series()
має справу з дією, яка хоче see all the result at the end
Я вважаю, що падіння async. водопаду є шкідливим, тому що важко переробити один раз написане, а також схильне до помилок, оскільки якщо ви надаєте більше аргументів, інші функції значно змінюють підпис.
Я настійно рекомендую async.autoInject
як чудову альтернативу асин. Водоспаду.
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) => {
// ...
}
])
таким чином ви не будете витягувати волосся, намагаючись переконатися, що аргументи функції мають правильну довжину. Перша функція приймає лише один аргумент - зворотний виклик. Усі решта повинні прийняти два аргументи - значення та зворотний виклик. Дотримуйтесь шаблону, і ви залишатиметесь здоровими!