Оскільки ваше завдання може містити асинхронний код, ви повинні сигналізувати прогалину, коли ваше завдання закінчиться виконанням (= "завершення асинхронізації").
У Gulp 3.x ви могли піти, не роблячи цього. Якщо ви явно не сигналізували про завершення асинхронного завершення, просто припустимо, що ваше завдання є синхронічним і що воно завершено, як тільки ваша функція завдання повернеться. Gulp 4.x в цьому плані суворіший. Ви повинні чітко сигналізувати про виконання завдання.
Це можна зробити шістьма способами :
1. Поверніть потік
Це насправді не варіант, якщо ви лише намагаєтеся надрукувати щось, але це, мабуть, найбільш часто використовуваний механізм завершення асинхронізації, оскільки ви зазвичай працюєте з потоками глоток. Ось (досить надуманий) приклад, що демонструє це для вашого випадку використання:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
Важлива частина тут - return
твердження. Якщо ви не повернете потік, gulp не може визначити, коли потік закінчився.
2. Повернення а Promise
Це набагато більш пристосований механізм для вашого випадку використання. Зауважте, що більшу частину часу вам не доведеться створювати Promise
об’єкт самостійно, він зазвичай забезпечується пакетом (наприклад, часто використовуваний del
пакет повертає a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Використовуючи синтаксис async / wait, це може бути спрощено ще більше. Усі функції, позначені 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/…