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 :
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:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
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 verwendete del
Paket a zurück Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
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 ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
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:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
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):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
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:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
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 .
gulp.task('message3', function() {
var e = new EventEmitter();
e.on('msg', function(msg) { console.log(msg); });
setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
return e;
});
webpack-stream
. Verwenden Sie dies: github.com/shama/webpack-stream/issues/…