Node 库有多种形式解决异步性能,最常见的模式是 error-first callbacks,除此之外,还有 streamspromise()event emitterschild processesobservablesgulp 工作规范化了所有这些类型的异步性能。

工作实现告诉

当从工作中返回 streampromiseevent emitterchild processobservable 时,胜利或谬误值将告诉 gulp 是否继续执行或完结。如果工作出错,gulp 将立刻完结执行并显示该谬误。

当应用 series() 组合多个工作时,任何一个工作的谬误将导致整个工作组合完结,并且不会进一步执行其余工作。当应用 parallel() 组合多个工作时,一个工作的谬误将完结整个工作组合的完结,然而其余并行的工作可能会执行完,也可能没有执行完。

返回 stream

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

返回 promise

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

返回 event emiter

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;

返回 child process

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

返回 observable

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

返回 callback

如果工作未返回任何内容,则必须应用 callback 来示意工作已实现,回调将作为以下示例中名为 cb() 的惟一参数传递给工作。

function callbackTask(cb) {  cb();}exports.default = callbackTask;

如需通过 callback 把工作中的谬误告知 gulp,请将 Error 作为 callback 的惟一参数。

function callbackError(cb) {  // `cb()` should be called by some async work  cb(new Error('kaboom'));}exports.default = callbackError;

然而,你通常会将此 callback 函数传递给另一个 API ,而不是本人调用它。

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

应用 async/await

如果不应用后面提供到几种形式,咱们还能够将工作定义为一个 async 函数,它将利用 promise 对你的工作进行包装。这将容许你应用 await 解决 promise,并应用其余同步代码。

示例:
const fs = require('fs');async function asyncAwaitTask() {  const { version } = fs.readFileSync('package.json');  console.log(version);  await Promise.resolve('some result');}exports.default = asyncAwaitTask;