2015-04-18 10 views
11

Come parte di un piccolo programma che sto scrivendo, mi piacerebbe usare gulp per convertire un grande insieme di file in markdown. Questo non fa parte di una fase di costruzione separata dal programma. Fa parte del programma. Quindi non sto usando un gulpfile per gestirlo.Come posso promettere un uso one-off di gulp nella mia applicazione?

Il problema è che, poiché è asincrono, voglio usare una promessa che mi avviserà quando il compito di Gulp è finito.

Qualcosa di simile sarebbe l'ideale:

io.convertSrc = function() { 
    var def = q.defer(); 

    gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist), function() { 
     def.resolve('We are done!'); 
    }); 

    return def.promise; 
} 

Ma pipe non prende un callback. Come potrei gestirlo? Grazie per il tuo aiuto, sono un po 'nuovo da bere.

risposta

14

Tutto in sorso è un flusso, in modo da poter solo ascoltare i end e error eventi.

io.convertSrc = function() { 
    var def = q.defer(); 
    gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist)) 
    .on('end', function() { 
     def.resolve(); 
    }) 
    .on('error', def.reject); 
    return def.promise; 
} 

Per inciso, Q 1.0 non viene più sviluppato (a parte alcune correzioni qua e là) e sarà totalmente compatibile con Q 2.0; Suggerirei Bluebird in alternativa.

Vale anche la pena ricordare che NodeJS 0.12 in poi ha promesse ES6 integrati in esso (non --harmony bandiera necessario) quindi se non siete alla ricerca di compatibilità con il passato si può semplicemente utilizzare al posto ..

io.convertSrc = function() { 
    return new Promise(function(resolve, reject) { 
    gulp.src(src + '/*.md') 
     .pipe(marked({})) 
     .pipe(gulp.dest(dist)) 
     .on('end', resolve) 
     .on('error', reject); 
    }); 
}; 
+0

Ah! Sì! Dovrei averlo capito! Grazie! –

+1

Inoltre, non avevo idea del supporto promesso da ES6 nel nodo. È pazzesco/fantastico. –

+1

Ho scoperto questa mattina solo quando la mia chiamata 'nuova promessa' ha funzionato senza installare Bluebird. Ero molto confuso per un momento. –

2

Dal momento che il compito Gulp è un flusso, è possibile ascoltare per i suoi eventi:

io.convertSrc = function() { 
    var def = q.defer(); 

    var stream = gulp.src(src + '/*.md') 
    .pipe(marked({})) 
    .pipe(gulp.dest(dist)); 

    stream.on('end', function() { 
    def.resolve(); 
    }); 

    stream.on('error', function(err) { 
    def.reject(err); 
    }); 

    return def.promise; 
};