2015-09-24 4 views
19

Sto lavorando a un corso di pluralight su gulp. John Papa sta dimostrando come iniettare una funzione che cancella i file css esistenti, nella routine che compila quelli nuovi.Comando del nodo - richiamata non attiva

Il callback sulla funzione del non viene attivato. La funzione è in esecuzione, il file viene eliminato, non vedo messaggi di errore. Se chiamo manualmente la callback, viene eseguita, quindi sembra che la funzione sia intatta. Quindi mi chiedo cosa potrebbe causare del non voler eseguire il callback.

eliminare di routine:

function clean(path, done) { 
    log('cleaning ' + path); 
    del(path, done); // problem call 
} 

La funzione di 'fatto' non è sparare, ma lo fa se cambio il codice a questo:

function clean(path, done) { 
    log('cleaning ' + path); 
    del(path); 
    done(); 
} 

Che, naturalmente, sconfigge lo scopo previsto di aspettare fino a quando non viene fatto prima di continuare.

Tutte le idee su ciò che sta accadendo sarebbero apprezzate.

per riferimento (nel caso pertinente):

compilazione funzione css:

gulp.task('styles', ['clean-styles'], function(){ 
    log('compiling less'); 
    return gulp 
     .src(config.less) 
     .pipe($.less()) 
     .pipe($.autoprefixer({browsers:['last 2 versions', '> 5%']})) 
     .pipe(gulp.dest(config.temp)); 
}); 

iniettato funzione di pulizia:

gulp.task('clean-styles', function(done){ 
    var files = config.temp + '/**/*.css'; 
    clean(files, done); 
}); 

UPDATE

Se qualcun altro incontra questo, ha rivisitato il traini ng video e stava usando la v1.1 di del. Ho controllato e stavo usando 2.x. Dopo aver installato v 1.1, tutto funziona.

+0

Possibile duplicato di [Gulp clean/del comportamento è cambiato] (http://stackoverflow.com/questions/32605090/gulp-clean-del-behaviour-has-changed) – Louis

risposta

22

del non è un comando del nodo, è probabilmente il pacchetto this npm. In questo caso, non riceve una richiamata come secondo parametro, ma restituisce una promessa e devi chiamare .then(done) per chiamarla dopo le finiture del.

Aggiornamento

Una soluzione migliore è quella di abbracciare il Gulp natura promessa:

Cambia la funzione clean a:

function clean(path) { 
    return del(path); // returns a promise 
} 

E il vostro compito clean-styles a:

gulp.task('clean-styles', function(){ 
    var files = config.temp + '/**/*.css'; 
    return clean(files); 
}); 
+0

Grazie. Divertente, l'ho provato, ma ha generato un errore. .then (done()) funziona per qualche motivo. Quello che mi stava lanciando era guardare il video con del (percorso, fatto) e stava funzionando. – Steve

+0

Sei sicuro di chiamare '.then (done())' funziona? Per me sembra che tu stia chiamando la funzione done (prematuramente) e invii il suo return come callback alla promessa 'del'. Vorresti incollare l'errore che avevi quando hai provato '.then (done)'? – gfpacheco

+0

buon punto, ovviamente il suo sparo proprio lì. qui err: http://prntscr.com/8k3z3g – Steve

4

Controllare i documenti for the del package sembra che tu ti stia confondendo tra il meccanismo di callback standard del nodo e del's, che sta usando una promessa.

Si vorrà utilizzare l'API promessa, con .then (done) per eseguire il parametro di callback.

Nodo e JavaScript, in generale, è attualmente in un po 'di uno stato di flusso per i modelli di progettazione per gestire il codice asincrono, con la maggior parte della comunità del browser e la gente gli standard che si appoggiano verso le promesse, considerando che la comunità nodo tende verso lo stile di callback e una libreria come asincrona.

Con le promesse di standardizzazione ES6, ho il sospetto che vedremo più di questi tipi di incompatibilità nel nodo in quanto le persone che sono appassionate di quell'API iniziano a incorporare sempre più codice nel codice del nodo.

12

A partire da version 2.0, l'API di del è stata modificata per utilizzare le promesse.

Così per specificare callback si dovrebbe usare .then():

del('unicorn.png').then(callback); 

In caso di necessità di chiamare da un compito sorso - solo tornare una promessa dal compito:

gulp.task('clean', function() { 
    return del('unicorn.png'); 
});