共计 1849 个字符,预计需要花费 5 分钟才能阅读完成。
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;
正文完