Error Gulp: las siguientes tareas no se completaron: ¿Olvidó indicar la finalización de la sincronización?

Tengo el siguiente gulpfile.js, que estoy ejecutando a través de la línea de comando “gulp message”:

var gulp = require('gulp'); gulp.task('message', function() { console.log("HTTP Server Started"); }); 

Recibo el siguiente mensaje de error:

 [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? 

Estoy usando gulp 4 en un sistema Windows 10. Aquí está el resultado de gulp –version:

 [14:15:15] CLI version 0.4.0 [14:15:15] Local version 4.0.0-alpha.2 

Dado que su tarea puede contener código asíncrono, debe señalar un gulp cuando su tarea haya terminado de ejecutarse (= “finalización asincrónica”).

En Gulp 3.x puedes escapar sin hacer esto. Si no indicaste explícitamente asincronización, Gulp simplemente asumiría que tu tarea es síncrona y que finalizará tan pronto como regrese tu función de tarea. Gulp 4.x es más estricto en este sentido. Tienes que señalar explícitamente la finalización de la tarea.

Puedes hacer eso de cinco maneras :

1. Devuelve una secuencia

Esto no es realmente una opción si solo está tratando de imprimir algo, pero es probablemente el mecanismo de compleción asincrónica más frecuentemente utilizado, ya que generalmente está trabajando con flujos de gulp. Aquí hay un ejemplo (bastante artificial) que lo demuestra para su caso de uso:

 var print = require('gulp-print'); gulp.task('message', function() { return gulp.src('package.json') .pipe(print(function() { return 'HTTP Server Started'; })); }); 

2. Devuelve una Promise

Este es un mecanismo mucho más apropiado para su caso de uso. Tenga en cuenta que la mayoría de las veces no tendrá que crear el objeto Promise usted mismo, generalmente lo proporcionará un paquete (por ejemplo, el paquete del usa frecuentemente devuelve Promise ).

 gulp.task('message', function() { return new Promise(function(resolve, reject) { console.log("HTTP Server Started"); resolve(); }); }); 

3. Llamar a la función de callback

Esta es probablemente la forma más fácil para su caso de uso: gulp automáticamente pasa una función de callback a su tarea como primer argumento. Simplemente llame a esa función cuando haya terminado:

 gulp.task('message', function(done) { console.log("HTTP Server Started"); done(); }); 

4. Devuelve un proceso hijo

Esto es más útil si tiene que invocar directamente una herramienta de línea de comandos porque no hay ningún contenedor node.js disponible. Funciona para su caso de uso, pero obviamente no lo recomendaría (especialmente porque no es muy portátil):

 var spawn = require('child_process').spawn; gulp.task('message', function() { return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' }); }); 

5. Devuelve un RxJS Observable .

Nunca he usado este mecanismo, pero si estás usando RxJS podría ser útil. Es algo exagerado si solo quieres imprimir algo:

 var Observable = require('rx').Observable; gulp.task('message', function() { var o = Observable.just('HTTP Server Started'); o.subscribe(function(str) { console.log(str); }); return o; }); 

Solución alternativa: debemos llamar a las funciones de callback (Tarea y Anónimo):

 function electronTask(callbackA) { return gulp.series(myFirstTask, mySeccondTask, (callbackB) => { callbackA(); callbackB(); })(); }