Comme votre tâche peut contenir du code asynchrone, vous devez signaler à gulp la fin de l'exécution de votre tâche (= "achèvement asynchrone").
Dans Gulp 3.x, vous pouviez vous en sortir sans faire cela. Si vous ne signaliez pas explicitement l'achèvement asynchrone, Gulp supposait simplement que votre tâche était synchrone et qu'elle était terminée dès que la fonction de la tâche revenait. Gulp 4.x est plus strict à cet égard. Vous pouvez consulter le site doivent signaler explicitement l'achèvement de la tâche.
Vous pouvez le faire dans six façons :
1. Retourner un Stream
Ce n'est pas vraiment une option si vous essayez seulement d'imprimer quelque chose, mais c'est probablement le mécanisme de complétion asynchrone le plus fréquemment utilisé puisque vous travaillez généralement avec des flux gulp. Voici un exemple (plutôt artificiel) qui le démontre pour votre cas d'utilisation :
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
La partie importante ici est le return
déclaration. Si vous ne retournez pas le flux, gulp ne peut pas déterminer quand le flux est terminé.
2. Retourner un Promise
C'est un mécanisme beaucoup plus adapté à votre cas d'utilisation. Notez que, la plupart du temps, vous n'aurez pas à créer l'objet Promise
vous-même, il sera généralement fourni par un paquetage (par exemple, l'application fréquemment utilisée del
renvoie un Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Utilisation de async/await La syntaxe peut être simplifiée encore davantage. Toutes les fonctions marquées async
renvoient implicitement une Promise, de sorte que la méthode suivante fonctionne également (si vos la version de node.js le supporte ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Appelez la fonction de rappel
C'est probablement le moyen le plus simple pour votre cas d'utilisation : gulp passe automatiquement une fonction de rappel à votre tâche comme premier argument. Il suffit d'appeler cette fonction lorsque vous avez terminé :
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
C'est surtout utile si vous devez invoquer un outil en ligne de commande directement parce qu'il n'y a pas de wrapper node.js disponible. Cela fonctionne pour votre cas d'utilisation mais évidemment je ne le recommanderais pas (surtout parce qu'il n'est pas très portable) :
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Je n'ai jamais utilisé ce mécanisme, mais si vous utilisez RxJS, il pourrait être utile. C'est un peu exagéré si vous voulez juste imprimer quelque chose :
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Comme la précédente, je l'inclus pour des raisons d'exhaustivité, mais ce n'est pas vraiment quelque chose que vous utiliserez à moins que vous n'utilisiez déjà un système de gestion de l'information. EventEmitter
pour une raison quelconque.
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;
});
1 votes
Si vous êtes ici parce que vous avez un problème avec
webpack-stream
. Utilisez ceci : github.com/shama/webpack-stream/issues/