Poiché l'attività potrebbe contenere codice asincrono, è necessario segnalare gulp al termine dell'esecuzione dell'attività (= "completamento asincrono").
In Gulp 3.x potresti cavartela senza farlo. Se non si segnalasse esplicitamente il completamento asincrono, gulp supponerebbe semplicemente che l'attività è sincrona e che sia terminata non appena la funzione dell'attività ritorna. Gulp 4.x è più rigoroso in questo senso. Si deve segnalare in modo esplicito completamento delle attività.
Puoi farlo in sei modi :
1. Restituisce uno stream
Questa non è davvero un'opzione se stai solo cercando di stampare qualcosa, ma è probabilmente il meccanismo di completamento asincrono più frequentemente utilizzato poiché di solito stai lavorando con gulp stream. Ecco un esempio (piuttosto elaborato) che lo dimostra per il tuo caso d'uso:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
La parte importante qui è la return
dichiarazione. Se non restituisci lo stream, gulp non può determinare quando lo stream è terminato.
2. Restituisci a Promise
Questo è un meccanismo molto più adatto al tuo caso d'uso. Nota che la maggior parte delle volte non dovrai creare il filePromise
oggetto da soli, in genere verrà fornito da un pacchetto (ad esempio il del
pacchetto utilizzato di frequente restituisce a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Utilizzando async / await sintassi questo può essere ulteriormente semplificato. Tutte le funzioni contrassegnate async
implicitamente restituiscono una Promessa in modo che anche le seguenti funzioni (se la versione di node.js la supporta ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Chiamare la funzione di richiamata
Questo è probabilmente il modo più semplice per il tuo caso d'uso: gulp passa automaticamente una funzione di callback al tuo compito come primo argomento. Basta chiamare quella funzione quando hai finito:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Ciò è utile soprattutto se è necessario richiamare direttamente uno strumento da riga di comando perché non è disponibile alcun wrapper node.js. Funziona per il tuo caso d'uso, ma ovviamente non lo consiglierei (soprattutto perché non è molto portatile):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Non ho mai usato questo meccanismo, ma se stai usando RxJS potrebbe essere utile. È un po 'eccessivo se vuoi solo stampare qualcosa:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Come il precedente lo sto includendo per completezza, ma non è davvero qualcosa che userete a meno che non lo stiate già usando EventEmitter
per qualche motivo.
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
. Usa questo: github.com/shama/webpack-stream/issues/…