J'ai le gulpfile.js suivant , que j'exécute via le message gulp en ligne de commande :
var gulp = require('gulp');
gulp.task('message', function() {
console.log("HTTP Server Started");
});
Je reçois le message d'erreur suivant:
[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?
J'utilise gulp 4 sur un système Windows 10. Voici la sortie de gulp --version
:
[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2
webpack-stream
. Utilisez ceci: github.com/shama/webpack-stream/issues/…Réponses:
Étant donné que votre tâche peut contenir du code asynchrone, vous devez signaler gulp lorsque votre tâche a terminé son exécution (= "achèvement asynchrone").
Dans Gulp 3.x, vous pourriez vous en sortir sans faire cela. Si vous n'avez pas explicitement signalé la fin de l'async, Gulp supposerait simplement que votre tâche est synchrone et qu'elle est terminée dès que votre fonction de tâche revient. Gulp 4.x est plus strict à cet égard. Vous devez signaler explicitement la fin de la tâche.
Vous pouvez le faire de six manières :
1. Renvoyer un flux
Ce n'est pas vraiment une option si vous essayez d'imprimer quelque chose, mais c'est probablement le mécanisme d'achèvement asynchrone le plus fréquemment utilisé puisque vous travaillez généralement avec des flux gulp. Voici un exemple (plutôt artificiel) le démontrant pour votre cas d'utilisation:
La partie importante ici est la
return
déclaration. Si vous ne renvoyez pas le flux, gulp ne peut pas déterminer quand le flux est terminé.2. Retournez un
Promise
Il s'agit d'un mécanisme beaucoup plus adapté à votre cas d'utilisation. Notez que la plupart du temps, vous n'aurez pas à créer l'
Promise
objet vous-même, il sera généralement fourni par un package (par exemple, ledel
package fréquemment utilisé renvoie aPromise
).L'utilisation de la syntaxe async / attente peut être encore simplifiée. Toutes les fonctions marquées
async
renvoient implicitement une promesse, de sorte que ce qui suit fonctionne également (si votre version node.js le prend en charge ):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. Appelez simplement cette fonction lorsque vous avez terminé:
4. Retourner un processus enfant
Ceci est surtout utile si vous devez appeler un outil de ligne de commande directement car il n'y a pas de wrapper node.js disponible. Cela fonctionne pour votre cas d'utilisation, mais je ne le recommanderais évidemment pas (d'autant plus qu'il n'est pas très portable):
5. Renvoyez un RxJS
Observable
.Je n'ai jamais utilisé ce mécanisme, mais si vous utilisez RxJS, cela pourrait être utile. C'est un peu exagéré si vous voulez juste imprimer quelque chose:
6. Retournez un
EventEmitter
Comme le précédent, j'inclus ceci par souci d'exhaustivité, mais ce n'est pas vraiment quelque chose que vous allez utiliser, sauf si vous utilisez déjà un
EventEmitter
pour une raison quelconque.la source
Un problème avec Gulp 4 .
Pour résoudre ce problème, essayez de modifier votre code actuel:
par exemple dans ceci:
ou dans ceci:
la source
Ça a marché!
la source
J'obtenais cette même erreur en essayant d'exécuter une construction SASS / CSS très simple .
Ma solution (qui peut résoudre ces mêmes erreurs ou des erreurs similaires) consistait simplement à ajouter
done
comme paramètre dans la fonction de tâche par défaut, et à l'appeler à la fin de la tâche par défaut:J'espère que cela t'aides!
la source
Vous devez faire deux choses:
async
avant la fonction.Commencez votre fonction avec
return
.la source
Je ne peux pas prétendre être très bien informé à ce sujet mais j'ai eu le même problème et je l'ai résolu.
Il existe une 7e façon de résoudre ce problème en utilisant une fonction asynchrone .
Écrivez votre fonction mais ajoutez le préfixe async .
En faisant cela, Gulp encapsule la fonction dans une promesse et la tâche s'exécutera sans erreur.
Exemple:
Ressources:
Dernière section de la page Gulp Achèvement asynchrone : utilisation asynchrone / wait .
Documents sur les fonctions asynchrones de Mozilla .
la source
C'est un problème lors de la migration de gulp version 3 vers 4, vous pouvez simplement ajouter un paramètre fait à la fonction de rappel, voir exemple,
la source
Solution: nous devons appeler les fonctions de rappel (tâche et anonyme):
la source
Et voilà: pas de tâches synchrones .
Pas de tâches synchrones
Les tâches synchrones ne sont plus prises en charge. Ils ont souvent conduit à des erreurs subtiles difficiles à déboguer, comme oublier de renvoyer vos flux d'une tâche.
Lorsque vous voyez l'
Did you forget to signal async completion?
avertissement, aucune des techniques mentionnées ci-dessus n'a été utilisée. Vous devrez utiliser le rappel d'erreur en premier ou renvoyer un flux, une promesse, un émetteur d'événement, un processus enfant ou observable pour résoudre le problème.Utilisation de
async
/await
Lorsque vous n'utilisez aucune des options précédentes, vous pouvez définir votre tâche en tant que
async function
, ce qui l'enveloppe dans une promesse . Cela vous permet de travailler avec des promesses de manière synchroneawait
et d'utiliser un autre code synchrone.la source
Fondamentalement, v3.X était plus simple, mais v4.x est strict dans ces moyens de tâches synchrones et asynchrones.
L' async / attente est un moyen assez simple et utile de comprendre le flux de travail et le problème.
Utilisez cette approche simple
la source
Je me débattais avec cela récemment et j'ai trouvé la bonne façon de créer une
default
tâche qui s'exécutaitsass
alorssass:watch
:la source
Ma solution: mettez tout avec async et attendez gulp.
la source
Vous devez faire une chose:
async
avant la fonction.la source
Ajoutez done comme paramètre dans la fonction par défaut. Cela fera l'affaire.
la source
Pour ceux qui essaient d'utiliser gulp pour le déploiement local de swagger, le code suivant vous aidera
la source
Pour moi, le problème était différent: Angular-cli n'était pas installé (j'ai installé une nouvelle version de Node à l'aide de NVM et j'ai simplement oublié de réinstaller angular cli)
Vous pouvez vérifier l'exécution de "ng version".
Si vous ne l'avez pas, lancez simplement "npm install -g @ angular / cli"
la source