关于gulp:Gulp-异步执行

5次阅读

共计 1849 个字符,预计需要花费 5 分钟才能阅读完成。

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;
正文完
 0