[英]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.