Node 库有多种形式解决异步性能,最常见的模式是 error-first callbacks
,除此之外,还有 streams
、promise()
、event emitters
、child processes
、observables
。gulp
工作规范化了所有这些类型的异步性能。
工作实现告诉
当从工作中返回 stream
、promise
、event emitter
、child process
或 observable
时,胜利或谬误值将告诉 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;