【发布时间】:2020-04-21 17:18:53
【问题描述】:
你如何处理无法解决的承诺?
例子:
class Utils {
static async thisFunctionOnlyResolvesWhenPassed2AndNeverRejects(number: number) {
return new Promise((resolve, reject) => {
if(number === 2) {
resolve('ok')
}
})
}
}
console.log(await Utils.thisFunctionOnlyResolvesWhenPassed2AndNeverRejects(2))
// this will print "ok" because 2 is passed and the promise is resolved
console.log(await Utils.thisFunctionOnlyResolvesWhenPassed2AndNeverRejects(5))
// this will crash the program silently
uncaughtException 和 unhandledRejection 在 promise 未解决时不返回任何内容。在 await 周围添加 try/catch 不起作用(没有错误)。最后,唯一可行的是使用Promise.then 而不是await。
问题是代码库充斥着async/await 和有时会解决的承诺(取决于条件)
问题:我可以添加一个打字稿标志来检测丢失的解析/拒绝吗?或者可能是一种将所有async/await 转换为使用Promise.then 的自动方式?
使用调试器时,程序在 Promise 之后停止,很难找到哪个函数/promise 缺少解析/拒绝。
重写所有async/await 调用以使用Promise.then 是我最后的手段。
【问题讨论】:
-
问题是:代码库中充斥着 async/await 和有时会解决的 Promises 这是代码库需要解决的问题。虽然有一些方法可以绕过它(例如,等待该 Promise 和 60 秒后拒绝的 Promise 的 Promise.race),但您不应该在消费者中这样做 - 修复为您提供的功能相反,这些 Promise 基本上都被打破了
-
return new Promise((resolve, reject) => { if(number === 2) { resolve('ok') }else{ resolve('not ok') } })跨度>
-
@CertainPerformance 你知道发生这种情况时我如何获得堆栈跟踪或错误吗?让我生气的是,这一切都在悄无声息地发生。我们的错误日志是空的,因为节点没有报告任何内容。我正在考虑包装整个程序并返回退出代码以检测它。如上所述,代码库中到处都是它,我需要在重构所有这些承诺之前确定问题的大小。谢谢!
-
对于一般情况,不可能从外部知道 Promise 是永远挂起还是最终会解决(或拒绝)。修复基础代码使其不会从根本上被破坏应该是第一步,而不是第二步
标签: javascript node.js asynchronous promise async-await