Это первоначально опубликовано автором на этом блог Отказ Эта версия была отредактирована для ясности, а некоторые детали могут отличаться от исходного поста.
Вступление
Async – это библиотека JavaScript, которая позволяет управлять потоком асинхронного кода JavaScript. В этом руководстве мы рассмотрим Asyncastraft
Способ выполнения асинхронных функций «по порядку».
Файлы проекта
Нажмите здесь Для загрузки файлов проекта. Обязательно запустите NPM установить
перед запуском Узел Main.js.
Настраивать
Во-первых, давайте настроим проект:
mkdir -p ~/Desktop/async-example && cd $_ && touch main.js && npm init
Как только вам будет предложено параметры, просто примите значения по умолчанию. Когда Package.json
Файл создан, установите Async:
npm i async -S
Затем откройте main.js
Файл вашего проекта и добавить следующее в файл:
var async = require('async'); async.waterfall([ function (done) { done(null, 'Value 1'); }, function (value1, done) { console.log(value1); done(null, 'Value 2'); }, function (value2, done) { console.log(value2); done(null, 'done'); } ], function (err) { if (err) throw new Error(err); });
Вы можете запустить это с Узел main.js
Отказ Как только вы запустите его, вы должны получить следующий вывод:
Value 1 Value 2
Пример
Давайте пройдемся по этому простому примеру кода:
Водопад
Метод принимает два параметра:
async.waterfall([], function (err) {});
- Первый аргумент – это массив, а второй аргумент – это функция.
- Используя первый аргумент (то есть массив), вы можете указать то, что вы хотите запустить в порядке.
- Используя второй аргумент (I.E. Функция), вы можете поймать любые ошибки, которые происходят в любой из шагов.
Теперь давайте рассмотрим первый аргумент более подробно. Чтобы определить шаги, которые вам нужно запускать, вам необходимо создать функцию для каждого шага. Например, если вам нужно два шага, вам необходимо создать две функции и поставить их в массив:
async.waterfall([ function firstStep() {}, function secondStep() {} ], function (err) {});
Как видите, мы определили две функции (они могут быть анонимными или названными, это не имеет значения). Следующим важном знанию – это аргументы, переданные на эти функции «шага»:
async.waterfall([ function firstStep(done) {}, function secondStep(previousResult, done) {} ], function (err) {});
Каждая шагарная функция принимает два аргумента, кроме первого. Первая шаговая функция требует только один аргумент. Используя аргументы, вы можете получить доступ к результату предыдущего шага, а также вызвать следующий шаг.
async.waterfall([ function firstStep(done) { done(null, 'Value from step 1'); }, function secondStep(previousResult, done) { console.log(previousResult); done(null); } ], function (err) {});
Если вы заметите, мы называем сделано
Функция с двумя аргументами: первый аргумент – это любая ошибка, которую мы хотим перейти к следующему шагу, а второй аргумент является фактическим результатом или значением, которое мы хотим перейти к следующему шагу. Как вы можете видеть, на данный момент мы установили значения ошибок в null
Потому что на данный момент мы не заботимся об ошибках. Надеюсь, это должно иметь больше смысла, почему первая шага требует одного параметра. Это потому, что ничто не было выполнено перед первой функцией, поэтому нет результатов, которые не могут передаваться на первую функцию.
Примечание: в кодовом фрагменте выше, оба Async.weaterfall. а также обещать иметь такую же скорость. Точка кода выше состоит в том, что Sencondstep. зависит от предыдущийresult.
Для завершения примера давайте добавим еще одну шаговую функцию и распечатайте результат в результате функции шага:
var async = require('async'); async.waterfall([ function firstStep(done) { console.log('start!'); done(null, 'Value from step 1'); // <- set value to passed to step 2 }, function secondStep(step1Result, done) { console.log(step1Result); done(null, 'Value from step 2'); // <- set value to passed to step 3 }, function thirdStep (step2Result, done) { console.log(step2Result); done(null); // <- no value set for the next step. } ], function (err) { if (err) { throw new Error(err); } else { console.log('No error happened in any steps, operation done!'); } });
Как только вы запустите это ( Node Main.js
) Вы должны получить следующий вывод:
start! Value from step 1 Value from step 2 No error happened in any steps, operation done!
Обертывание
В случае async
и Обещание
, оба могут иметь дело с асинхронной природой JavaScript (что может быть нелегко полагаться). Однако в некоторых случаях у нас будут обратные вызовы, которые зависят от предыдущего (который является случай, упомянутым в этой статье). В таких случаях мы должны вызвать второй обратный вызов после Первый закончен. Так или Asyncastraft
или Обещание
не может сделать его быстрее, так как наш второй обратный вызов основан на результате первого.
Так вот, по сути, Asyncastraft
концептуально похоже на
promise.then(...)
У них такая же природа зависимости, но и разные стили кода
Это сказано, я надеюсь, что вы нашли этот учебник полезным!
Другие учебники, которые вы можете найти интересным
- Асинхронные задачи, использующие сельдерей с Джанго
- Обработка асинхронной природы Node.js: образец проекта
- Все, что вам нужно знать о Async & Meteor