2015-03-27 16 views
22

Un compito in sorso può essere definita in questo modo:gulp: dove è definita la funzione di callback del task gulp?

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

Sto cercando di capire quale sia la funzione di callback è. Dove è definito? Posso passare in qualche altra funzione come argomento in fase di esecuzione? Che cosa fa?

These docs indica che l'argomento di callback è un suggerimento per Orchestrator che l'attività deve essere eseguita in modo asincrono, dove l'esecuzione del callback indica che l'attività asincrona è stata completata.

Con un po 'di sperimentazione sembra che chiamando la callback senza argomenti restituisce una condizione di successo, e chiamandolo con qualche stringa genera un errore:

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

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

(a parte: Come faccio a piazzare una pausa tra blocchi di codice ? in StackOverflow mark-down)

$ 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) 

Quindi, le domande che ho sono:

  • Is questa è l'unica funzionalità del callback, per sollevare un'eccezione se viene passato un argomento e per completarlo correttamente altrimenti o fa qualcos'altro?
  • Potrei sovrascriverlo con qualche altra funzione (e ci sarebbe una ragione ragionevole per farlo)?

Forse le mie capacità di lettura della documentazione mi stanno fallendo (non sarebbe la prima volta), ma non riesco a trovare le risposte a queste domande nei documenti API.

Grazie per qualsiasi aiuto.

+0

Dovresti riassumere il tuo post per fare solo una domanda, anche il tuo titolo non corrisponde alla tua domanda. Cosa intendevi per pausa? –

+0

Ho rimosso una domanda che era un po 'fuori tema, ma il resto delle domande sono abbastanza strettamente collegate. Per quanto ho capito, il titolo corrisponde a questi semplicemente bene. Forse quando vedrò una risposta capirò che non è una buona corrispondenza. – laffoyb

+0

Con "una pausa tra i blocchi di codice" intendo che avevo due blocchi di codice che erano logicamente distinti (uno da un file sorgente, uno dalla riga di comando IO) che volevo mettere uno accanto all'altro ma con una pausa dal evidenziazione del blocco di codice per indicare che non fanno tutti parte dello stesso file. Penso che questo sia chiamato "scherma" in alcune aree? – laffoyb

risposta

32

La funzione di callback proviene da Orchestrator (o il nuovo - undertaker - in Gulp 4) e in realtà non è altro che una chiamata per comunicare al task che il task è stato "completato". Ecco perché lo hanno cambiato in

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

Nei prossimi documenti per rendere quel punto più chiaro.

Perché è necessaria la richiamata? Di solito, si torna un ruscello quando si definisce un compito:

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

restituendo un corso d'acqua, il sistema dei task è in grado di pianificare l'esecuzione di tali flussi. Ma a volte, specialmente quando sei in un callback dell'inferno o quando chiami un plug-in senza stream, non sei in grado di restituire un flusso. Ecco a cosa serve il callback. Per far sapere al task che hai finito e passare alla prossima chiamata nella catena di esecuzione.

alle vostre domande:

Is this the only functionality of the callback, to raise an exception if passed an argument and to complete successfully otherwise?

No, l'unica funzionalità è quella di lasciare che il sistema dei task sapere che il vostro compito è fatto.

Is there anything else that it does?

No.

Could I override it with some other function (and would there be any sane reason to do so)?

No e No.

Is it possible to pass any other arguments to a gulp task function?

No, ma perché dovresti? Hai tutto lo scopo di un file JS sul tuo servizio, basta posizionare i tuoi argomenti da qualche parte.

+0

Quindi, se ho capito bene, il modo idiomatico per passare argomenti a gulp attività è apportare modifiche a una configurazione globale? – laffoyb

+1

Beh, è ​​JavaScript ... hai qualche possibilità in più. Ma confezionato: Sì, sarebbe un caso comune (e sì, questo è anche uno dei difetti di Gulp). – ddprrt

+0

Ho paura di aver iniziato a utilizzare JavaScript e NodeJS solo di recente, quindi non credo di conoscere le altre possibilità. – laffoyb

Problemi correlati