web-dev-qa-db-fra.com

gulp: où la fonction de rappel de tâche gulp est-elle définie?

Une tâche dans gulp peut être définie comme suit:

gulp.task('foobar', function(callback) { ... });

J'essaie de comprendre ce qu'est la fonction de rappel. Où est-il défini? Puis-je passer une autre fonction comme argument lors de l'exécution? Qu'est ce que ça fait?

Ces documents indiquent que l'argument de rappel est un indice pour Orchestrator que la tâche doit être exécutée de manière asynchrone, où l'exécution du rappel indique que la tâche asynchrone est terminée.

Avec une certaine expérimentation, il semble que l'appel au rappel sans argument renvoie un état de réussite, et l'appel avec une chaîne génère une erreur:

gulp.task('foobar', function(callback) {
    callback();
});

gulp.task('bazkad', function(callback) {
    callback("some string");
});  

(à part: comment placer une pause entre les blocs de code dans le démarquage StackOverflow?)

$ gulp foobar
[09:59:54] Using gulpfile ~\repos\gulpproj\gulpfile.js
[09:59:54] Starting 'foobar'...
[09:59:54] Finished 'foobar' after 56 μs
$ gulp bazkad
[10:05:49] Using gulpfile ~\repos\gulpproj\gulpfile.js
[10:05:49] Starting 'bazkad'...
[10:05:49] 'bazkad' errored after 55 μs
[10:05:49] Error: some string
    at formatError (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:169:10)
    at Gulp.<anonymous> (~\AppData\Roaming\npm\node_modules\gulp\bin\gulp.js:195:15)
    at Gulp.emit (events.js:107:17)
    at Gulp.Orchestrator._emitTaskDone (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:264:8)
    at ~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:275:23
    at finish (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:21:8)
    at cb (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:29:3)
    at Gulp.<anonymous> (~\repos\gulpproj\gulpfile.js:35:5)
    at module.exports (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\lib\runTask.js:34:7)
    at Gulp.Orchestrator._runTask (~\repos\gulpproj\node_modules\gulp\node_modules\orchestrator\index.js:273:3)

Donc, mes questions sont:

  • Est-ce la seule fonctionnalité du rappel, pour déclencher une exception si un argument est passé et pour terminer correctement dans le cas contraire, ou fait-il autre chose?
  • Puis-je le remplacer par une autre fonction (et y aurait-il une raison raisonnable de le faire)?

Peut-être que mes compétences en lecture de documentation me manquent (ce ne serait pas la première fois), mais je n'arrive pas à trouver les réponses à ces questions dans la documentation de l'API.

Merci pour toute aide.

26
laffoyb

La fonction de rappel vient d'Orchestrator (ou du nouveau - entrepreneur de pompes funèbres - dans Gulp 4) et n'est en fait rien de plus qu'un appel pour dire au système de tâches que votre tâche est "terminée". C'est pourquoi ils l'ont changé en

gulp.task('something', function(done) { ... });

Dans les prochains documents pour clarifier ce point.

Pourquoi avez-vous besoin du rappel? Habituellement, vous renvoyez un flux lors de la définition d'une tâche:

gulp.task('goodstuff', function() {
    return gulp.src('./app/**/*.*')
        .pipe(someotherstuff())
        .pipe(gulp.dest('./dist');
});

En renvoyant un flux, le système de tâches est en mesure de planifier l'exécution de ces flux. Mais parfois, en particulier lorsque vous êtes en enfer ou que vous appelez un plugin sans flux, vous ne pouvez pas retourner un flux. C'est à cela que sert le rappel. Faire savoir au système de tâches que vous avez terminé et passer au prochain appel de la chaîne d'exécution.

A vos questions:

Est-ce la seule fonctionnalité du rappel, pour déclencher une exception si un argument est passé et pour terminer correctement dans le cas contraire?

Non, la seule fonctionnalité consiste à informer le système de tâches que votre tâche est terminée.

Y a-t-il autre chose qu'il fait?

Non.

Puis-je le remplacer par une autre fonction (et y aurait-il une raison raisonnable de le faire)?

Non et non.

Est-il possible de passer d'autres arguments à une fonction de tâche gulp?

Non, mais pourquoi le feriez-vous? Vous avez la portée complète d'un fichier JS sur votre service, placez simplement vos arguments quelque part.

37
ddprrt