由于您的任务可能包含异步代码,因此您必须在任务完成执行时发出gulp信号(=“异步完成”)。
在Gulp 3.x中,您可以不这样做而逃脱。如果您未明确表示异步完成信号,那么gulp只会假设您的任务是同步的,并且一旦任务函数返回就完成了。Gulp 4.x在这方面更严格。您必须明确表示任务已完成。
您可以通过以下六种方式进行操作:
1.返回流
如果您仅尝试打印某些内容,这并不是一个真正的选择,但是它可能是最常用的异步完成机制,因为您通常使用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
包返回a Promise
)。
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
使用异步/等待语法,可以进一步简化。标记为async
隐式的所有函数都返回Promise,因此以下内容也可以工作(如果您的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,它可能会很有用。如果您只想打印一些内容,那是一种矫kill过正:
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/…–