簡體   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