У меня есть следующий gulpfile.js , который я выполняю через сообщение gulp командной строки :
var gulp = require('gulp');
gulp.task('message', function() {
console.log("HTTP Server Started");
});
Я получаю следующее сообщение об ошибке:
[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?
Я использую gulp 4 в системе Windows 10. Вот вывод из gulp --version
:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
webpack-stream
. Используйте это: github.com/shama/webpack-stream/issues/…Ответы:
Поскольку ваша задача может содержать асинхронный код, вы должны сигнализировать gulp, когда ваша задача завершит выполнение (= "асинхронное завершение").
В Gulp 3.x вы могли бы уйти, не делая этого. Если вы не указали явное асинхронное завершение, gulp просто предположил бы, что ваша задача является синхронной и что она завершается, как только ваша задача возвращается. Gulp 4.x более строг в этом отношении. Вы должны явно сигнализировать о завершении задачи.
Вы можете сделать это шестью способами :
1. Верните поток
На самом деле это не вариант, если вы только пытаетесь что-то напечатать, но это, вероятно, наиболее часто используемый механизм асинхронного завершения, поскольку вы обычно работаете с потоками gulp. Вот (довольно надуманный) пример, демонстрирующий это для вашего варианта использования:
Важной частью здесь является
return
утверждение. Если вы не вернете поток, gulp не сможет определить, когда поток закончился.2. Вернуть
Promise
Это гораздо более подходящий механизм для вашего случая использования. Обратите внимание, что в большинстве случаев вам не нужно создавать
Promise
объект самостоятельно, обычно он предоставляется пакетом (например, часто используемыйdel
пакет возвращает aPromise
).С помощью синтаксиса async / await это может быть еще более упрощено. Все функции, помеченные
async
неявно, возвращают Promise, поэтому также работает следующее (если ваша версия node.js поддерживает это ):3. Вызвать функцию обратного вызова
Вероятно, это самый простой способ для вашего варианта использования: gulp автоматически передает функцию обратного вызова вашей задаче в качестве первого аргумента. Просто вызовите эту функцию, когда закончите:
4. Вернуть дочерний процесс
Это в основном полезно, если вам нужно вызывать инструмент командной строки напрямую, потому что нет доступной обертки node.js. Это работает для вашего случая использования, но, очевидно, я бы не рекомендовал его (тем более что он не очень портативный):
5. Верните RxJS
Observable
.Я никогда не использовал этот механизм, но если вы используете RxJS, он может быть полезен. Это немного излишне, если вы просто хотите что-то напечатать:
6. Вернуть
EventEmitter
Как и предыдущий, я включаю это для полноты картины, но на самом деле это не то, что вы собираетесь использовать, если
EventEmitter
по какой-то причине вы уже не используете его .источник
Проблема с Gulp 4 .
Для решения этой проблемы попробуйте изменить свой текущий код:
например в это:
или в это:
источник
Это сработало!
источник
Я получал ту же ошибку, пытаясь запустить очень простую сборку SASS / CSS .
Мое решение (которое может решить эту же или аналогичные ошибки) состояло в том, чтобы просто добавить
done
в качестве параметра в функцию задачи по умолчанию и вызвать ее в конце задачи по умолчанию:Надеюсь это поможет!
источник
Вам нужно сделать две вещи:
async
перед функцией.Начните свою функцию с
return
.источник
Я не могу утверждать, что я очень хорошо осведомлен в этом, но у меня была та же проблема, и я решил ее.
Есть 7-й способ решить эту проблему, используя асинхронную функцию .
Напишите свою функцию, но добавьте префикс async .
Делая это, Gulp оборачивает функцию в обещание, и задача будет выполняться без ошибок.
Пример:
Ресурсы:
Последний раздел на странице Gulp Асинхронное завершение : Использование async / await .
Асинхронные функции Mozilla Docs .
источник
Это проблема при переходе с gulp версии 3 на 4. Просто вы можете добавить параметр, выполненный в функцию обратного вызова, см. Пример,
источник
Обходной путь: нам нужно вызвать функции обратного вызова (Task и Anonymous):
источник
Здесь вы идете: нет синхронных задач .
Нет синхронных задач
Синхронные задачи больше не поддерживаются. Они часто приводили к тонким ошибкам, которые трудно было отладить, например, забывать возвращать потоки из задачи.
Когда вы видите
Did you forget to signal async completion?
предупреждение, ни один из методов, упомянутых выше, не использовался. Вам нужно будет использовать обратный вызов с ошибкой сначала или вернуть поток, обещание, источник событий, дочерний процесс или наблюдаемый для решения проблемы.Использование
async
/await
Если вы не используете ни одну из предыдущих опций, вы можете определить свою задачу как
async function
, которая обернет вашу задачу в обещание . Это позволяет синхронно работать с обещаниямиawait
и использовать другой синхронный код.источник
В принципе, v3.X был проще, но v4.x строг в этих средствах синхронных и асинхронных задач.
Асинхронный / Await довольно простой и удобный способ , чтобы понять рабочий процесс & вопрос.
Используйте этот простой подход
источник
Недавно я боролся с этим и нашел правильный способ создать
default
задачу, которая запускаласьsass
тогдаsass:watch
:источник
Мое решение: поставить все с асинхронным и ждать глотком.
источник
Вам нужно сделать одну вещь:
async
перед функцией.источник
Добавить сделано в качестве параметра в функции по умолчанию. Что будет делать.
источник
Для тех, кто пытается использовать gulp для локального развертывания, следующий код поможет
источник
Для меня проблема была в другом: Angular-cli не был установлен (я установил новую версию Node с помощью NVM и просто забыл переустановить Angular Cli)
Вы можете проверить запуск "ng version".
Если у вас его нет, просто запустите "npm install -g @ angular / cli"
источник