描述
我写了一个简单的附录:
declare global {
interface Promise<T> {
isFulfilled: Promise<boolean>;
}
}
Object.defineProperty(Promise.prototype, "isFulfilled", {
async get<T>(this: Promise<T>): Promise<boolean> {
const symbol = Promise.resolve(Symbol());
try {
const result = (await Promise.race([this, symbol]) !== symbol);
console.log("after promise");
return result;
} catch {
console.log(`catch`);
return true;
}
}
});
const promise = new Promise<void>(async (resolve) => {
throw new Error(`Test error`);
});
console.log(await (promise.isFulfilled));
export { };
我们看到,Promise 的执行发生在 try 中,并没有超越它。这种情况下,如果出现错误,try应该捕获它,并去catch。
我收到一个错误并且尝试继续:
问题
为什么会发生这种情况?
我该如何修复我的功能?
这里,根据代码判断,称之为 isSettled 可能更为正确。已完成 - 这指的是承诺已成功完成,并且您检查它已基本完成,即非待处理。但请您自己看看。
同时有多处出现错误。首先,不清楚为什么需要解析该符号。现在有一个承诺,比较“!==符号”将始终为真。
其次,一个测试例子。异步函数被传递给 promise 构造函数。最后,她自己抛出了异常并返回了一个被拒绝的承诺,该承诺未被处理,因此将错误转储到控制台。并且您通过构造函数创建的承诺永远处于待处理状态,因为传递给构造函数的函数中没有未处理的异常(并且没有人调用解析/拒绝函数)。然后在 isFulfilled 竞赛中返回一个符号,正如上面所说,它不等于带有符号的承诺。完全正确,无虚假。
针对 isFulfilled 和测试示例的更正版本: