Ich habe die folgenden gulpfile.js , die ich über die Befehlszeile gulp message ausführe :
var gulp = require('gulp');
gulp.task('message', function() {
console.log("HTTP Server Started");
});
Ich erhalte die folgende Fehlermeldung:
[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?
Ich verwende gulp 4 auf einem Windows 10-System. Hier ist die Ausgabe von gulp --version
:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
webpack-stream
. Verwenden Sie dies: github.com/shama/webpack-stream/issues/…Antworten:
Da Ihre Aufgabe möglicherweise asynchronen Code enthält, müssen Sie gulp signalisieren, wenn die Ausführung Ihrer Aufgabe abgeschlossen ist (= "asynchrone Fertigstellung").
In Gulp 3.x könnten Sie davonkommen, ohne dies zu tun. Wenn Sie nicht explizit einen asynchronen Abschluss signalisieren, geht gulp einfach davon aus, dass Ihre Aufgabe synchron ist und beendet ist, sobald Ihre Aufgabenfunktion zurückkehrt. Gulp 4.x ist in dieser Hinsicht strenger. Sie müssen den Abschluss der Aufgabe explizit signalisieren.
Sie können dies auf sechs Arten tun :
1. Geben Sie einen Stream zurück
Dies ist keine Option, wenn Sie nur versuchen, etwas zu drucken, aber es ist wahrscheinlich der am häufigsten verwendete asynchrone Abschlussmechanismus, da Sie normalerweise mit Schluck-Streams arbeiten. Hier ist ein (ziemlich ausgeklügeltes) Beispiel, das es für Ihren Anwendungsfall demonstriert:
Der wichtige Teil hier ist die
return
Aussage. Wenn Sie den Stream nicht zurückgeben, kann gulp nicht feststellen, wann der Stream beendet ist.2. Geben Sie a zurück
Promise
Dies ist ein viel passenderer Mechanismus für Ihren Anwendungsfall. Beachten Sie, dass Sie das
Promise
Objekt die meiste Zeit nicht selbst erstellen müssen , sondern normalerweise von einem Paket bereitgestellt werden (z. B. gibt das häufig verwendetedel
Paket a zurückPromise
).Mit der Async / Await- Syntax kann dies noch weiter vereinfacht werden. Alle
async
implizit markierten Funktionen geben ein Versprechen zurück, sodass auch Folgendes funktioniert (wenn Ihre node.js-Version dies unterstützt ):3. Rufen Sie die Rückruffunktion auf
Dies ist wahrscheinlich der einfachste Weg für Ihren Anwendungsfall: gulp übergibt automatisch eine Rückruffunktion als erstes Argument an Ihre Aufgabe. Rufen Sie diese Funktion einfach auf, wenn Sie fertig sind:
4. Geben Sie einen untergeordneten Prozess zurück
Dies ist vor allem dann nützlich, wenn Sie ein Befehlszeilentool direkt aufrufen müssen, da kein node.js-Wrapper verfügbar ist. Es funktioniert für Ihren Anwendungsfall, aber ich würde es natürlich nicht empfehlen (zumal es nicht sehr portabel ist):
5. Geben Sie einen RxJS zurück
Observable
.Ich habe diesen Mechanismus noch nie verwendet, aber wenn Sie RxJS verwenden, kann er nützlich sein. Es ist eine Art Overkill, wenn Sie nur etwas drucken möchten:
6. Senden Sie eine
EventEmitter
Wie beim vorherigen schließe ich dies der Vollständigkeit halber ein, aber es ist nicht wirklich etwas, das Sie verwenden werden, es sei denn, Sie verwenden
EventEmitter
aus irgendeinem Grund bereits ein .quelle
Ein Problem mit Gulp 4 .
Versuchen Sie zur Lösung dieses Problems, Ihren aktuellen Code zu ändern:
zum Beispiel in diese:
oder hinein:
quelle
Das hat funktioniert!
quelle
Beim Versuch, einen sehr einfachen SASS / CSS- Build auszuführen, wurde derselbe Fehler angezeigt .
Meine Lösung (die dieselben oder ähnliche Fehler beheben kann) bestand darin, einfach
done
einen Parameter in die Standardaufgabenfunktion einzufügen und ihn am Ende der Standardaufgabe aufzurufen:Hoffe das hilft!
quelle
Sie müssen zwei Dinge tun:
async
Vor Funktion hinzufügen .Starten Sie Ihre Funktion mit
return
.quelle
Ich kann nicht behaupten, diesbezüglich sehr gut informiert zu sein, aber ich hatte das gleiche Problem und habe es gelöst.
Es gibt eine 7. Möglichkeit, dies mithilfe einer asynchronen Funktion zu beheben .
Schreiben Sie Ihre Funktion, aber fügen Sie das asynchrone Präfix hinzu .
Auf diese Weise verpackt Gulp die Funktion in ein Versprechen und die Aufgabe wird fehlerfrei ausgeführt.
Beispiel:
Ressourcen:
Letzter Abschnitt auf der Gulp- Seite Async Completion : Verwenden von async / await .
Mozilla- asynchrone Funktionsdokumente .
quelle
Dies ist ein Problem bei der Migration von gulp Version 3 auf 4. Sie können einfach einen Parameter zur Rückruffunktion hinzufügen, siehe Beispiel,
quelle
Problemumgehung: Wir müssen die Rückruffunktionen (Task und Anonymous) aufrufen:
quelle
Los geht's: Keine synchronen Aufgaben .
Keine synchronen Aufgaben
Synchrone Aufgaben werden nicht mehr unterstützt. Sie führten oft zu subtilen Fehlern, die schwer zu debuggen waren, z. B. das Vergessen, Ihre Streams von einer Aufgabe zurückzugeben.
Wenn Sie die
Did you forget to signal async completion?
Warnung sehen, wurde keine der oben genannten Techniken verwendet. Sie müssen den Fehler-First-Rückruf verwenden oder einen Stream, ein Versprechen, einen Ereignisemitter, einen untergeordneten Prozess oder eine beobachtbare Datei zurückgeben, um das Problem zu beheben.Verwenden von
async
/await
Wenn Sie keine der vorherigen Optionen verwenden, können Sie Ihre Aufgabe als eine definieren
async function
, die Ihre Aufgabe in ein Versprechen einschließt . Auf diese Weise können Sie mit Versprechungen synchron arbeitenawait
und anderen synchronen Code verwenden.quelle
Grundsätzlich war v3.X einfacher, aber v4.x ist bei diesen Mitteln für synchrone und asynchrone Aufgaben streng.
Das asynchrone / Warten ist eine ziemlich einfache und hilfreiche Methode, um den Workflow und das Problem zu verstehen.
Verwenden Sie diesen einfachen Ansatz
quelle
Ich hatte kürzlich Probleme damit und fand den richtigen Weg, um eine
default
Aufgabe zu erstellen , diesass
dann ausgeführt wirdsass:watch
:quelle
Meine Lösung: Alles asynchronisieren und auf einen Schluck warten.
quelle
Hinzufügen als Parameter in der Standardfunktion hinzugefügt. Das wird reichen.
quelle
Für diejenigen, die versuchen, gulp für die prahlerische lokale Bereitstellung zu verwenden, hilft der folgende Code
quelle
Für mich war das Problem anders: Angular-cli wurde nicht installiert (ich habe eine neue Node-Version mit NVM installiert und einfach vergessen, zu installieren).
Sie können die Ausführung von "ng version" überprüfen.
Wenn Sie es nicht haben, führen Sie einfach "npm install -g @ angle / cli" aus.
quelle
Sie müssen eines tun:
async
Vor Funktion hinzufügen .quelle