เนื่องจากงานของคุณอาจมีรหัสไม่ตรงกันคุณต้องส่งสัญญาณอึกเมื่องานของคุณเสร็จสิ้นการดำเนินการ (= "async complete")
ใน Gulp 3.x คุณสามารถหนีโดยไม่ทำสิ่งนี้ หากคุณไม่ได้ส่งสัญญาณการเสร็จสิ้น async อย่างชัดเจนเพียงแค่คิดว่างานของคุณซิงโครนัสและจะเสร็จสิ้นทันทีที่ฟังก์ชันงานของคุณส่งคืน อึก 4.x เข้มงวดในเรื่องนี้ คุณต้องส่งสัญญาณความสำเร็จของงานอย่างชัดเจน
คุณสามารถทำได้หกวิธี :
นี่ไม่ใช่ตัวเลือกหากคุณพยายามพิมพ์บางอย่างเท่านั้น แต่อาจเป็นกลไกการทำให้เสร็จสมบูรณ์ที่ใช้บ่อยที่สุดเนื่องจากคุณมักจะทำงานกับลำธารอึก นี่คือตัวอย่าง (มีการวางแผนค่อนข้าง) แสดงให้เห็นถึงกรณีการใช้งานของคุณ:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
ส่วนสำคัญที่นี่คือreturn
คำสั่ง หากคุณไม่ได้ส่งกระแสข้อมูลอีกต่อไปอึกไม่สามารถระบุได้ว่ากระแสข้อมูลเสร็จสิ้นแล้ว
นี่เป็นกลไกที่เหมาะสมกว่าสำหรับกรณีการใช้งานของคุณ โปรดทราบว่าส่วนใหญ่คุณจะไม่ต้องสร้างPromise
วัตถุด้วยตัวเองโดยปกติจะให้บริการโดยแพคเกจ (เช่นdel
แพคเกจที่ใช้บ่อยส่งคืน a Promise
)
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
การใช้ไวยากรณ์async / awaitนี้สามารถทำให้ง่ายยิ่งขึ้นอีก ฟังก์ชั่นทั้งหมดที่ทำเครื่องหมายasync
ส่งคืนสัญญาโดยปริยายดังนั้นการทำงานต่อไปนี้ก็เช่นกัน (หากรุ่น node.jsของคุณรองรับ ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. เรียกฟังก์ชั่นการโทรกลับ
นี่อาจเป็นวิธีที่ง่ายที่สุดสำหรับกรณีการใช้งานของคุณ: gulp ส่งผ่านฟังก์ชันการเรียกกลับไปที่งานของคุณโดยอัตโนมัติเป็นอาร์กิวเมนต์แรก เพียงเรียกใช้ฟังก์ชันนั้นเมื่อเสร็จสิ้น:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
สิ่งนี้มีประโยชน์เป็นส่วนใหญ่หากคุณต้องเรียกใช้เครื่องมือบรรทัดคำสั่งโดยตรงเนื่องจากไม่มีตัวห่อหุ้ม node.js มันใช้งานได้กับกรณีการใช้งานของคุณ แต่เห็นได้ชัดว่าฉันจะไม่แนะนำ (โดยเฉพาะอย่างยิ่งเนื่องจากมันไม่ได้พกพามาก):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
ฉันไม่เคยใช้กลไกนี้ แต่ถ้าคุณใช้ RxJS มันอาจมีประโยชน์ มันช่างเกินกำลังหากคุณต้องการพิมพ์บางอย่าง:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
เช่นเดียวกับก่อนหน้านี้ฉันกำลังรวมสิ่งนี้ไว้ด้วยเพื่อความสมบูรณ์ แต่มันไม่ใช่สิ่งที่คุณจะใช้เว้นแต่คุณจะใช้EventEmitter
ด้วยเหตุผลบางอย่าง
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
ถ้าคุณอยู่ที่นี่เพราะคุณได้มีปัญหากับ ใช้สิ่งนี้: github.com/shama/webpack-stream/issues/…