Оскільки ваше завдання може містити асинхронний код, ви повинні сигналізувати прогалину, коли ваше завдання закінчиться виконанням (= "завершення асинхронізації").
У 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/…