由于您的任务可能包含异步代码,因此您必须在任务完成执行时发出 gulp 信号(=“异步完成”)。
在 Gulp 3.x 中,您无需这样做就可以逃脱。如果您没有明确表示异步完成,gulp 只会假设您的任务是同步的,并且一旦您的任务函数返回它就完成了。 Gulp 4.x 在这方面更加严格。您必须明确表示任务完成。
你可以在six ways:
如果您只是想打印一些东西,这并不是一个真正的选择,但它可能是最常用的异步完成机制,因为您通常使用 gulp 流。这是一个(相当人为的)示例,为您的用例演示它:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
这里的重要部分是return 语句。如果您不返回流,gulp 无法确定流何时结束。
这是一个更适合您的用例的机制。请注意,大多数情况下您不必自己创建 Promise 对象,它通常由包提供(例如,经常使用的 del 包返回 Promise)。
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
使用async/await 语法可以进一步简化。所有标记为async 的函数都隐式返回一个Promise,因此以下内容也有效(如果您的node.js version supports it):
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;
});