gpt4 book ai didi

gulp 错误: The following tasks did not complete: Did you forget to signal async completion?

转载 作者:行者123 更新时间:2023-12-03 04:17:20 27 4
gpt4 key购买 nike

我有以下gulpfile.js,我通过命令行执行gulp消息:

var gulp = require('gulp');

gulp.task('message', function() {
console.log("HTTP Server Started");
});

我收到以下错误消息:

[14:14:41] Using gulpfile ~\Documents\node\first\gulpfile.js
[14:14:41] Starting 'message'...
HTTP Server Started
[14:14:41] The following tasks did not complete: message
[14:14:41] Did you forget to signal async completion?

我在 Windows 10 系统上使用 gulp 4。以下是 gulp --version 的输出:

[14:15:15] CLI version 0.4.0
[14:15:15] Local version 4.0.0-alpha.2

最佳答案

由于您的任务可能包含异步代码,因此您必须在任务完成执行时发出 gulp 信号(=“异步完成”)。

在 Gulp 3.x 中,您无需执行此操作即可逃脱。如果您没有明确发出异步完成信号,那么 gulp 只会假设您的任务是同步的,并且任务函数一返回就完成。 Gulp 4.x 在这方面更加严格。您必须明确表示任务已完成。

您可以在six ways中做到这一点:

1。返回 Stream

如果您只是想打印一些东西,这并不是一个真正的选择,但它可能是最常用的异步完成机制,因为您通常使用 gulp 流。这是一个(相当人为的)示例,为您的用例演示了它:

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 包返回 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();
});

4。返回 child process

如果您必须直接调用命令行工具,因为没有可用的 Node.js 包装器,那么这非常有用。它适用于您的用例,但显然我不会推荐它(特别是因为它不太便携):

var spawn = require('child_process').spawn;

gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});

5。返回 RxJS Observable .

我从未使用过这种机制,但如果您使用 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;
});

6。返回 EventEmitter

与前一个一样,为了完整起见,我将其包括在内,但除非您已经在使用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;
});

关于 gulp 错误: The following tasks did not complete: Did you forget to signal async completion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36897877/

27 4 0