#
Асинхронное выполнениеNode библиотеки обрабатывают асинхронность различными способами. Наиболее распространенным шаблоном является обратные вызовы error-first, но вы также можете встретить потоки, промисы, эмиттеры событий, дочерние процессы или наблюдаемые. Задачи Gulp нормализуют все эти типы асинхронности.
#
Сигнал о завершении задачиКогда поток, обещание, эмиттер событий, дочерний процесс или наблюдаемый объект возвращается из задачи, успех или ошибка сообщает gulp, продолжать или завершать. Если в задаче возникает ошибка, gulp немедленно завершится и покажет эту ошибку.
При составлении задач с помощью series()
, ошибка завершает составление и никакие дальнейшие задачи не будут выполняться. При составлении задач с помощью parallel()
, ошибка завершит композицию, но другие параллельные задачи могут завершиться, а могут и не завершиться.
#
Вернуть поток#
Вернуть промис#
Вернуть эмиттер события#
Вернуть дочерний процесс#
Вернуть наблюдаемый#
Использование обратного вызова при ошибкеЕсли ваша задача ничего не вернула, вы должны использовать обратный вызов error-first, чтобы сигнализировать о завершении. Обратный вызов будет передан вашей задаче как единственный аргумент - в примерах ниже он называется cb()
.
To indicate to gulp that an error occurred in a task using an error-first callback, call it with an Error
as the only argument.
Однако вы часто будете передавать этот обратный вызов другому API вместо того, чтобы вызывать его самостоятельно.
#
Отсутствие синхронных задачСинхронные задачи больше не поддерживаются. Они часто приводили к незаметным ошибкам, которые было трудно отладить, например, к забыванию вернуть потоки из задачи.
Когда вы видите предупреждение «Вы забыли сигнализировать об асинхронном завершении?», значит, ни один из упомянутых выше методов не использовался. Вам нужно будет использовать обратный вызов error-first или вернуть поток, промис, эмиттер событий, дочерний процесс или наблюдаемое, чтобы решить проблему.
#
Использование async/awaitЕсли вы не используете какие-либо из предыдущих параметров, вы можете определить свою задачу как async
функцию, которая заключает вашу задачу в обещание. Это позволяет вам работать с обещаниями синхронно с помощью await
и использовать другой синхронный код.