美文网首页
Gulp 异步执行

Gulp 异步执行

作者: 暖A暖 | 来源:发表于2021-07-23 22:46 被阅读0次

    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;
    

    相关文章

      网友评论

          本文标题:Gulp 异步执行

          本文链接:https://www.haomeiwen.com/subject/hzxmmltx.html