关于gulp:Gulp-异步执行

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;

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理