Mam następujący plik gulpfile.js , który wykonuję za pomocą komunikatu gulp z wiersza poleceń :
var gulp = require('gulp');
gulp.task('message', function() {
console.log("HTTP Server Started");
});
Otrzymuję następujący komunikat o błędzie:
[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?
Używam gulp 4 w systemie Windows 10. Oto dane wyjściowe z gulp --version
:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
webpack-stream
. Użyj tego: github.com/shama/webpack-stream/issues/…Odpowiedzi:
Ponieważ Twoje zadanie może zawierać kod asynchroniczny, musisz zasygnalizować łyk, gdy zadanie zakończy się (= „zakończenie asynchroniczne”).
W Gulp 3.x można było uciec bez robienia tego. Jeśli nie zasygnalizowałeś jawnie zakończenia asynchronicznego, gulp po prostu przyjmie, że twoje zadanie jest synchroniczne i że jest ukończone, gdy tylko funkcja zadania powróci. Gulp 4.x jest pod tym względem surowszy. Państwo musi wyraźnie sygnalizować zakończenie zadania.
Możesz to zrobić na sześć sposobów :
1. Zwróć strumień
Nie jest to tak naprawdę opcja, jeśli próbujesz tylko coś wydrukować, ale prawdopodobnie jest to najczęściej używany mechanizm uzupełniania asynchronicznego, ponieważ zwykle pracujesz ze strumieniami gulp. Oto (raczej wymyślony) przykład demonstrujący to dla twojego przypadku użycia:
Ważną częścią tutaj jest
return
stwierdzenie. Jeśli nie zwrócisz strumienia, gulp nie może określić, kiedy strumień się zakończył.2. Zwróć a
Promise
Jest to o wiele bardziej odpowiedni mechanizm dla twojego przypadku użycia. Zauważ, że przez większość czasu nie musisz samodzielnie tworzyć
Promise
obiektu, zwykle jest on dostarczany przez pakiet (np. Często używanydel
pakiet zwraca aPromise
).Za pomocą składni async / await można to jeszcze bardziej uprościć. Wszystkie funkcje oznaczone w
async
sposób dorozumiany zwracają obietnicę, więc działają również następujące funkcje (jeśli obsługuje ją wersja node.js ):3. Wywołaj funkcję oddzwaniania
Jest to prawdopodobnie najłatwiejszy sposób użycia w przypadku użycia: gulp automatycznie przekazuje funkcję zwrotną do zadania jako pierwszy argument. Po zakończeniu wywołaj tę funkcję:
4. Zwróć a proces potomny
Jest to szczególnie przydatne, jeśli musisz bezpośrednio wywołać narzędzie wiersza poleceń, ponieważ nie ma dostępnego opakowania node.js. Działa w twoim przypadku użycia, ale oczywiście nie poleciłbym go (zwłaszcza, że nie jest zbyt przenośny):
5. Zwróć RxJS
Observable
.Nigdy nie korzystałem z tego mechanizmu, ale jeśli używasz RxJS, może się przydać. To rodzaj przesady, jeśli po prostu chcesz coś wydrukować:
6. Zwróć an
EventEmitter
Podobnie jak poprzedni, włączam to ze względu na kompletność, ale tak naprawdę nie będzie to coś, czego będziesz używać, chyba że
EventEmitter
z jakiegoś powodu już go używasz .źródło
Problem z Gulp 4 .
Aby rozwiązać ten problem, spróbuj zmienić swój obecny kod:
na przykład do tego:
lub w to:
źródło
To działało!
źródło
Ten sam błąd występował podczas próby uruchomienia bardzo prostej kompilacji SASS / CSS .
Moim rozwiązaniem (które może rozwiązać te same lub podobne błędy) było po prostu dodanie
done
jako parametru w domyślnej funkcji zadania i wywołanie jej na końcu domyślnego zadania:Mam nadzieję że to pomoże!
źródło
Musisz zrobić dwie rzeczy:
async
przed funkcją.Rozpocznij swoją funkcję za pomocą
return
.źródło
Nie mogę twierdzić, że mam dużą wiedzę na ten temat, ale miałem ten sam problem i go rozwiązałem.
Istnieje 7 sposób na rozwiązanie tego problemu, za pomocą funkcji asynchronicznej .
Napisz swoją funkcję, ale dodaj przedrostek asynchroniczny .
W ten sposób Gulp otacza funkcję obietnicą, a zadanie uruchomi się bez błędów.
Przykład:
Zasoby:
Ostatni odcinek na Gulp strony Async Zakończenie : Korzystanie asynchroniczny / Oczekujcie .
Dokumenty funkcji asynchronicznych Mozilli .
źródło
Jest to problem podczas migracji z wersji gulp 3 do 4. Po prostu możesz dodać parametr zrobiony do funkcji oddzwaniania, patrz przykład,
źródło
Obejście: Musimy wywołać funkcje zwrotne (Zadanie i Anonimowy):
źródło
Proszę bardzo: brak synchronicznych zadań .
Brak synchronicznych zadań
Zadania synchroniczne nie są już obsługiwane. Często prowadziły do subtelnych błędów, które były trudne do debugowania, takich jak zapomnienie o zwróceniu strumieni z zadania.
Kiedy zobaczysz
Did you forget to signal async completion?
ostrzeżenie, żadna z wyżej wymienionych technik nie została zastosowana. Aby rozwiązać problem, musisz użyć wywołania zwrotnego z pierwszym błędem lub zwrócić strumień, obietnicę, emiter zdarzeń, proces potomny lub obserwowalny.Używanie
async
/await
Gdy nie używasz żadnej z poprzednich opcji, możesz zdefiniować swoje zadanie jako
async function
, które otacza twoje zadanie obietnicą . Pozwala to na synchroniczną pracę z obietnicamiawait
i używanie innego kodu synchronicznego.źródło
Zasadniczo wersja 3.X była prostsza, ale wersja 4.x jest rygorystyczna w przypadku tych zadań synchronicznych i asynchronicznych.
Asynchroniczny / Oczekujcie jest dość prosta i pomocny sposób zrozumieć workflow problem.
Użyj tego prostego podejścia
źródło
Miałem problemy z tym niedawno i znaleźć właściwą drogę, aby utworzyć
default
zadanie, które działasass
wtedysass:watch
było:źródło
Moje rozwiązanie: umieść wszystko z asynchronizacją i czekaj na łyk.
źródło
Dodaj wykonane jako parametr w funkcji domyślnej. To wystarczy.
źródło
Dla tych, którzy próbują użyć gulp do lokalnego wdrożenia swagger, pomoże następujący kod
źródło
Dla mnie problem był inny: Angular-cli nie został zainstalowany (zainstalowałem nową wersję Węzła za pomocą NVM i po prostu zapomniałem ponownie zainstalować Angular-cli)
Możesz sprawdzić uruchomienie „wersji”.
Jeśli go nie masz, po prostu uruchom „npm install -g @ angular / cli”
źródło
Musisz zrobić jedną rzecz:
async
przed funkcją.źródło