繁体   English   中英

如何在 NodeJS API 中正确处理 Gulp 的任务 function?

[英]How to handle properly the Gulp's Task function in NodeJS API?

目前,我只知道一种在没有gulpfile和 CLI 的情况下运行 Gulp 任务的工作方法:

import Gulp from "gulp";

const TASK_NAME: string = "EXAMPLE_TASK";

Gulp.task(TASK_NAME, Gulp.parallel([
    // ... imported task fuctions ...
]);

Gulp.task(TASK_NAME)(
    (error?: Error | null): void => { if (isNeitherUndefinedNorNull(error)) { console.error(error); } }
);

这不是问题的主题; 我只是解释了我在做什么以及为什么我的代码是这样的,但是如果您知道在没有gulpfile和 CLI 的情况下执行 Gulp 任务的更好方法,请现在告诉我。

现在关于主题。 直到最近,如果 typescript-eslint ,代码的最后一部分( Gulp.task(TASK_NAME)(/*... */) )还没有被no-floating-promises规则拒绝 @types/gulp gulp (或typescript-eslint - 现在很难探索哪一个)的最新更新之后,typescript typescript-eslint警告我:

必须正确处理承诺或使用void运算符明确标记为忽略

那里。 我知道这不是虚惊一场。 有时我的 Gulp 任务链因unhandled promise rejection而中断,但 promise 的位置并不明显。 现在我有了提示,但仍不清楚。

我对此进行了探索:

  1. Gulp.task()返回了Undertaker.TaskFunctionWrapped
  2. TaskFunctionWrapped扩展了TaskFunctionBase
  3. TaskFunctionBase is (done: TaskCallback): ReturnType<AsyncTask>;
  4. AsyncTask是:
export type AsyncTask<R = any> =
  ((done: VoidCallback) => void)
  | ((done: Callback<R>) => void)
  | (() => ChildProcess | EventEmitter | Observable<R> | PromiseLike<R> | Stream);

根据文档,任务 function 必须返回ChildProcessEventEmitterObservablePromiseStream 但是如何处理呢? Gult.task()()则不可:

在此处输入图像描述

短信错误:

TS2339:“void |”类型上不存在属性“catch” 事件发射器 | 子进程 | Stream | 可观察 | 许诺”。

更新:@TheBumpaster 解决方案尝试

不幸的是,@typescript/eslint 仍然在Gulp.task(ProjectBuilder.GULP_TASK_NAME)行中告诉我“必须正确处理承诺或使用void运算符明确标记为忽略”。

const task: Promise<void> = new Promise<void>((resolve: () => void, reject: (error: Error) => void): void => {

  console.log("checkpoint1");

  Gulp.task(ProjectBuilder.GULP_TASK_NAME)(
      (error?: Error | null): void => {

        if (isNeitherUndefinedNorNull(error)) {
          console.log("checkpoint2-A");
          reject(error);
        } else {
          console.log("checkpoint2-B");
          resolve();
        }
      }
  );
});

task.catch((error: Error): void => { console.error(error); });

我故意在一些 gulp 插件中增加错误。 项目生成器到达"checkpoint1"但既没有到达"checkpoint2-A"也没有到达"checkpoint2-B" output 是:


D:\XXX\node_modules\async-done\index.js:18
    throw err;
    ^

Error [ERR_UNHANDLED_ERROR]: Unhandled error. ({
  uid: 0,
  name: '<anonymous>',
  branch: false,
  error: AssertionError [ERR_ASSERTION]:

也许它间接表明@typescript/eslint 大喊大叫不是口头上的……

您应该已经知道“catch” function 需要处理承诺这一事实。

根据https://gulpjs.com/docs/en/getting-started/async-completion/

Gulp.Task(ProjectBuilder.GLUP_TASK_NAME)( (error) => { if ( error ) { 
  throw new Error(error); } // this is already executed 
 }

const task = new Promise( (resolve, reject ) => {

Gulp.Task(ProjectBuilder.GLUP_TASK_NAME)( (error) => { if ( error ) { reject(error) } resolve() }

});

task().then().catch(e => console.error(e))

评论更新:

也许这个例子可以帮助你演示我上面的代码的意思。

const gulp = require("gulp")
const taskName = "task-name"

// Example callback
gulp.task(taskName, (error) => {
    if (error) {
        console.error(error);
    }
    // It's already executed here
    console.log(taskName)
});

// Example Promise object
const Task = new Promise( (resolve, reject) => {
    gulp.task(taskName, (error) => {
        if (error) {
            reject(error)
        }
        resolve(taskName)
    });
});

Task.then(console.log).catch(console.error)

// Example Promise function
const performTask = (_taskName) => {
    return new Promise( (resolve, reject) => {
        gulp.task(_taskName, (error) => {
            if (error) {
                reject(error)
            }
            resolve(_taskName)
        });
    });
}

performTask(taskName).then(console.log).catch(console.error)


// Example async/await with then/catch
const exampleServiceHandler = async (_taskName) => {
    // Perform actions here
    try {
        return await gulp.task(_taskName) // Resolve the task
    } catch (exception) {
        return exception;
    }
}

exampleServiceHandler(taskName)
.then(console.log)
.catch(console.error)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM