如何解决如何在 NodeJS API 中正确处理 Gulp 的 Task 函数?
目前,我只知道一种无需 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)(/* ... */)
)
如果 no-floating-promises 没有被 typescript-eslint 规则拒绝。在 @types/gulp
(或 typescript-eslint
的最新更新之后 - 现在很难探索是哪一个)
typescript-eslint
警告我:
必须正确处理 Promise 或使用 void
运算符明确标记为忽略
那里。我知道这不是误报。有时我的 Gulp 任务链被 unhandled promise rejection
破坏了,但是 promise 在哪里并不明显。现在我有了提示,但仍然不清楚。
我对此进行了探索:
-
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 仍然在 void
行中告诉我“必须正确处理 Promise 或使用 Gulp.task(ProjectBuilder.GULP_TASK_NAME)
运算符明确标记为忽略”。
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 的大喊大叫不是口头上的...
解决方法
你应该已经意识到'catch'函数需要处理promise。
根据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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。