Vì tác vụ của bạn có thể chứa mã không đồng bộ, bạn phải báo hiệu gulp khi tác vụ của bạn đã thực hiện xong (= "hoàn thành async").
Trong Gulp 3.x bạn có thể thoát khỏi mà không cần làm điều này. Nếu bạn không báo hiệu rõ ràng việc hoàn thành không đồng bộ, gulp sẽ chỉ cho rằng nhiệm vụ của bạn là đồng bộ và nó sẽ kết thúc ngay khi chức năng nhiệm vụ của bạn trở lại. Gulp 4.x chặt chẽ hơn về vấn đề này. Bạn phải báo hiệu rõ ràng nhiệm vụ hoàn thành.
Bạn có thể làm điều đó theo sáu cách :
1. Trả lại một luồng
Đây thực sự không phải là một lựa chọn nếu bạn chỉ cố gắng in một cái gì đó, nhưng có lẽ đó là cơ chế hoàn thành async được sử dụng thường xuyên nhất vì bạn thường làm việc với các luồng gulp. Đây là một ví dụ (khá giả) chứng minh nó cho trường hợp sử dụng của bạn:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
Phần quan trọng ở đây là return
tuyên bố. Nếu bạn không trả lại luồng, gulp không thể xác định khi nào luồng kết thúc.
2. Trả lại một Promise
Đây là một cơ chế phù hợp hơn nhiều cho trường hợp sử dụng của bạn. Lưu ý rằng hầu hết thời gian bạn sẽ không phải tự tạo Promise
đối tượng, nó thường sẽ được cung cấp bởi một gói (ví dụ: del
gói được sử dụng thường xuyên trả về a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Sử dụng cú pháp async / await, điều này có thể được đơn giản hóa hơn nữa. Tất cả các chức năng được đánh dấu async
hoàn toàn trả về một Promise để các chức năng sau cũng hoạt động (nếu phiên bản node.js của bạn hỗ trợ nó ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Gọi chức năng gọi lại
Đây có lẽ là cách dễ nhất cho trường hợp sử dụng của bạn: gulp tự động chuyển một hàm gọi lại cho tác vụ của bạn làm đối số đầu tiên. Chỉ cần gọi chức năng đó khi bạn hoàn thành:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Điều này chủ yếu hữu ích nếu bạn phải gọi trực tiếp một công cụ dòng lệnh vì không có trình bao bọc node.js khả dụng. Nó hoạt động cho trường hợp sử dụng của bạn nhưng rõ ràng tôi không khuyên dùng nó (đặc biệt là vì nó không dễ mang theo):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Tôi chưa bao giờ sử dụng cơ chế này, nhưng nếu bạn đang sử dụng RxJS thì nó có thể hữu ích. Đó là loại quá mức nếu bạn chỉ muốn in một cái gì đó:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Giống như phần trước tôi bao gồm điều này vì mục đích hoàn chỉnh, nhưng nó không thực sự là thứ bạn sẽ sử dụng trừ khi bạn đang sử dụng EventEmitter
vì một lý do nào đó.
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
. Sử dụng cái này: github.com/shama/webpack-stream/issues/,