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 :
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:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
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ł.
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żywany del
pakiet zwraca a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
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 ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
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ę:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
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):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
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ć:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
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 .
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
. Użyj tego: github.com/shama/webpack-stream/issues/…