异步完成#

Node 库以各种方式处理异步性。最常见的模式是“错误优先回调”,但您也可能遇到流、承诺、事件发射器、子进程或可观察对象。Gulp 任务会标准化所有这些类型的异步性。

信号任务完成#

当从任务返回流、承诺、事件发射器、子进程或可观察对象时,成功或错误会告知 gulp 是否继续或结束。如果任务出错,gulp 将立即结束并显示该错误。

使用 series() 组合任务时,错误将结束组合,不会执行更多任务。使用 parallel() 组合任务时,错误将结束组合,但其他并行任务可能会或可能不会完成。

返回流#

const { src, dest } = require('gulp');
function streamTask() {
return src('*.js')
.pipe(dest('output'));
}
exports.default = streamTask;

返回承诺#

function promiseTask() {
return Promise.resolve('the value is ignored');
}
exports.default = promiseTask;

返回事件发射器#

const { EventEmitter } = require('events');
function eventEmitterTask() {
const emitter = new EventEmitter();
// Emit has to happen async otherwise gulp isn't listening yet
setTimeout(() => emitter.emit('finish'), 250);
return emitter;
}
exports.default = eventEmitterTask;

返回子进程#

const { exec }
function childProcessTask()
return exec('date');
}
exports.default = childProcessTask;

返回一个可观察对象#

const { Observable } = require('rxjs');
function observableTask() {
return Observable.of(1, 2, 3);
}
exports.default = observableTask;

使用错误优先回调#

如果从任务中没有返回任何内容,则必须使用错误优先回调来表示完成。回调将作为唯一参数传递给您的任务 - 在下面的示例中命名为cb()

function callbackTask(cb)
// `cb()`应该由一些异步工作调用
cb();
}
exports.default = callbackTask;

要指示gulp���使用错误优先回调的任务中发生错误,请将其作为唯一参数调用Error

function callbackError(cb)
// `cb()`应该由一些异步工作调用
cb(new Error('kaboom'));
}
exports.default = callbackError;

但是,您通常会将此回调传递给另一个API,而不是自己调用它。

const fs = require('fs');
function passingCallback(cb)
fs.access('gulpfile.js', cb);
}
exports.default = passingCallback;

不支持同步任务#

不再支持同步任务。它们经常导致难以调试的细微错误,比如忘记从任务中返回流。

当您看到"您是否忘记信号异步完成?"警告时,没有使用上述任何技术。您需要使用错误优先回调或返回流、Promise、事件发射器、子进程或可观察对象来解决问题。

使用async/await#

如果没有使用前面提到的任何选项,您可以将任务定义为一个async函数,它将您的任务包装在一个Promise中。这使您可以使用await同步地处理Promise并使用其他同步代码。

const fs = require('fs');
async function asyncAwaitTask()
const { version } = console.log版本
await Promise.resolve"一些结果"
}
exports.default = asyncAwaitTask