Karena tugas Anda mungkin berisi kode asinkron, Anda harus memberi sinyal tegukan ketika tugas Anda telah selesai dijalankan (= "penyelesaian async").
Dalam Gulp 3.x Anda bisa pergi tanpa melakukan ini. Jika Anda tidak secara eksplisit mengisyaratkan penyelesaian async, hanya akan menganggap bahwa tugas Anda sinkron dan selesai segera setelah fungsi tugas Anda kembali. Gulp 4.x lebih ketat dalam hal ini. Anda harus secara eksplisit memberi sinyal penyelesaian tugas.
Anda dapat melakukannya dalam enam cara :
1. Kembalikan Stream
Ini sebenarnya bukan pilihan jika Anda hanya mencoba untuk mencetak sesuatu, tetapi itu mungkin mekanisme penyelesaian async yang paling sering digunakan karena Anda biasanya bekerja dengan aliran tegukan. Berikut adalah contoh (agak dibuat-buat) yang menunjukkannya untuk kasus penggunaan Anda:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
Bagian penting di sini adalah return
pernyataan. Jika Anda tidak mengembalikan aliran, tegukan tidak dapat menentukan kapan aliran selesai.
2. Pengembalian a Promise
Ini adalah mekanisme yang jauh lebih pas untuk kasus penggunaan Anda. Perhatikan bahwa sebagian besar waktu Anda tidak perlu membuat Promise
objek sendiri, biasanya akan disediakan oleh paket (misalnya paket yang sering digunakan del
mengembalikan a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Menggunakan sintaks async / await ini dapat disederhanakan lebih jauh. Semua fungsi yang ditandai async
secara implisit mengembalikan Janji sehingga hal berikut juga berfungsi (jika versi node.js Anda mendukungnya ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Panggil fungsi panggilan balik
Ini mungkin cara termudah untuk kasus penggunaan Anda: tegukan secara otomatis meneruskan fungsi panggilan balik ke tugas Anda sebagai argumen pertama. Panggil saja fungsi itu setelah selesai:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Ini sebagian besar berguna jika Anda harus menjalankan alat baris perintah secara langsung karena tidak ada pembungkus node.js. Ini berfungsi untuk use case Anda tapi jelas saya tidak akan merekomendasikannya (terutama karena ini tidak terlalu portabel):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Saya tidak pernah menggunakan mekanisme ini, tetapi jika Anda menggunakan RxJS mungkin berguna. Agak berlebihan jika Anda hanya ingin mencetak sesuatu:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Seperti yang sebelumnya saya memasukkan ini untuk kelengkapan, tapi itu bukan sesuatu yang benar-benar akan Anda gunakan kecuali Anda sudah menggunakan EventEmitter
karena suatu alasan.
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
. Gunakan ini: github.com/shama/webpack-stream/issues/…