【发布时间】:2021-05-16 02:14:56
【问题描述】:
目前,我只知道一种在没有 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 任务执行的更好方法,现在请告诉我。
现在关于主题。直到最近,代码的最后一部分(Gulp.task(TASK_NAME)(/* ... */))
如果typescript-eslint,则未被no-floating-promises 规则拒绝。通过@types/gulp 的最新更新(或typescript-eslint - 现在很难探索哪一个)
typescript-eslint警告我:
必须正确处理承诺或使用
void运算符明确标记为忽略
那里。我知道这不是虚惊一场。有时我的 Gulp 任务链因unhandled promise rejection 而中断,但承诺在哪里并不明显。现在我有了提示,但仍然不清楚。
我对此进行了探索:
-
Gulp.task()返回了Undertaker.TaskFunctionWrapped -
TaskFunctionWrapped扩展了TaskFunctionBase -
TaskFunctionBase是(done: TaskCallback): ReturnType<AsyncTask>; -
AsyncTask是:
export type AsyncTask<R = any> =
((done: VoidCallback) => void)
| ((done: Callback<R>) => void)
| (() => ChildProcess | EventEmitter | Observable<R> | PromiseLike<R> | Stream);
根据documentation,任务函数必须返回ChildProcess、EventEmitter、Observable、Promise或Stream。但是如何处理呢? Gult.task()() 不可用:
发短信错误:
TS2339:类型“void |”上不存在属性“catch”事件发射器 |子进程 |流 |可观察 | PromiseLike'。
更新:@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"。输出是:
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 大喊大叫不是口头上的......
【问题讨论】:
标签: node.js typescript promise gulp typescript-eslint