[英]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 的位置並不明顯。 現在我有了提示,但仍不清楚。
我對此進行了探索:
Gulp.task()
返回了Undertaker.TaskFunctionWrapped
TaskFunctionWrapped
擴展了TaskFunctionBase
TaskFunctionBase
is (done: TaskCallback): ReturnType<AsyncTask>;
AsyncTask
是:export type AsyncTask<R = any> =
((done: VoidCallback) => void)
| ((done: Callback<R>) => void)
| (() => ChildProcess | EventEmitter | Observable<R> | PromiseLike<R> | Stream);
根據文檔,任務 function 必須返回ChildProcess
、 EventEmitter
、 Observable
、 Promise
或Stream
。 但是如何處理呢? Gult.task()()
則不可:
短信錯誤:
TS2339:“void |”類型上不存在屬性“catch” 事件發射器 | 子進程 | Stream | 可觀察 | 許諾”。
不幸的是,@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.