Göreviniz eşzamansız kod içerebileceğinden, göreviniz tamamlandığında (= "eşzamansız tamamlama") gulp sinyali vermeniz gerekir.
Gulp 3.x'te bunu yapmadan kurtulabilirsiniz. Async tamamlama yutuculuğunu açıkça belirtmediyseniz, görevinizin senkronize olduğunu ve görev işleviniz geri döner dönmez biteceğini varsayarsınız. Gulp 4.x bu konuda daha katıdır. Sen zorunda açıkça görev tamamlandığına işaret.
Bunu altı şekilde yapabilirsiniz :
1. Bir Akış Döndürme
Bu, yalnızca bir şey yazdırmaya çalışıyorsanız gerçekten bir seçenek değildir, ancak genellikle gulp akışlarıyla çalıştığınız için muhtemelen en sık kullanılan asenkron tamamlama mekanizmasıdır. Kullanım durumunuz için bunu gösteren (oldukça çelişkili) bir örnek:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
Burada önemli olan return
ifade. Akışı geri döndürmezseniz gulp, akışın ne zaman bittiğini belirleyemez.
Bu, kullanım durumunuz için çok daha uygun bir mekanizmadır. Çoğu zaman Promise
nesneyi kendiniz oluşturmak zorunda kalmayacağınıza, genellikle bir paket tarafından sağlanacağına dikkat edin (örneğin, sık kullanılan del
paket a döndürür Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Kullanılması zaman uyumsuz / bekliyoruz sözdizimi bu daha da kolaylaşır edilebilir. async
Örtük olarak işaretlenen tüm işlevler bir Promise döndürür, böylece aşağıdakiler de çalışır ( node.js sürümünüz destekliyorsa ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Geri arama işlevini çağırın
Bu muhtemelen kullanım durumunuz için en kolay yoldur: gulp otomatik olarak görevinize ilk argüman olarak bir geri çağrı işlevi iletir. İşiniz bittiğinde bu işlevi çağırmanız yeterlidir:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Bu, çoğunlukla bir node.js sarmalayıcısı olmadığından doğrudan bir komut satırı aracını çağırmanız gerektiğinde yararlıdır. Kullanım durumunuz için çalışır, ancak kesinlikle tavsiye etmem (özellikle çok taşınabilir olmadığı için):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Bu mekanizmayı hiç kullanmadım, ancak RxJS kullanıyorsanız faydalı olabilir. Sadece bir şey yazdırmak istiyorsanız biraz aşırıya kaçmak:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Birincisi gibi bunu tamlık uğruna ekliyorum, ancak bir EventEmitter
nedenden dolayı zaten kullanmadığınız sürece gerçekten kullanacağınız bir şey değil .
gulp.task('message3', function() {
var e = new EventEmitter();
e.on('msg', function(msg) { console.log(msg); });
setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
return e;
});
webpack-stream
. Bunu kullanın: github.com/shama/webpack-stream/issues/…