Яка різниця між водоспадом async. і async.series


Відповіді:


168

Здається, що async.waterfallкожна функція дозволяє передати свої результати наступній функції, в той час як async.seriesпередає всі результати до остаточного зворотного виклику. На більш високому рівні це async.waterfallбуло б для конвеєра даних ("задано 2, помножте його на 3, додайте 2 і розділіть на 17"), тоді async.seriesяк для дискретних завдань, які повинні виконуватися в порядку, але інакше є окремими.


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

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

Вищенаведена відповідь може бути правильною ще до 2012 року, але правильна - це те саме, що і наступна, а саме: серія (), як її називають, що ВСІ результати отримують як серію, передану до Кінцевого зворотного виклику, а водоспад - ОСТАННІЙ результат, переданий на остаточний зворотний виклик. Дивіться розробника Mozilla
— 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
Дивовижно створені образи. Ви створили їх самостійно чи дістали десь ще?
— користувач1451111

ви повинні поставити фотографії у відповідь, люди, ймовірно, пропустять їх о / ш
— Олександр Міллс

1

Я вважаю, що падіння 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) => {
     // ...
  }
])

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.