Gulp 异步执行
Posted 知否
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gulp 异步执行相关的知识,希望对你有一定的参考价值。
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;
以上是关于Gulp 异步执行的主要内容,如果未能解决你的问题,请参考以下文章
Gulp插件之run-sequence控制任务顺序或者并行执行
我应该在 Fragment 中的啥生命周期状态下执行异步任务?