如何处理可能导致死锁的承诺

How to handle promises which can cause deadlocks

假设我有一个带有关键部分的 nodejs 应用程序,我想在其中调节对一些数据结构的访问。在本节中,我使用承诺创建对服务器的休息调用,我需要响应来决定如何退出此关键部分。在承诺本身中,我必须使用一个仍然使用回调的库。在极少数情况下,服务器似乎超载了,我根本没有得到响应。结果,应用程序卡在 promise 内,因此卡在关键部分内,从而导致死锁。有什么办法可以防止这种行为?仅向网络请求添加 setTimeout 并取消响应超时是一种好方法吗?

您可以只使用 SetTimeout。

new Promise((Resolve,Reject) => {
    doHttpRequest(callback)
    // if it takes too long, we will reject before it is resolved.
    setTimeout(() => { Reject("Timeout") },3000)
})

受@IronMan 评论的启发,我使用 promise.race 创建了一个解决方案并包装了正在执行其余调用的函数:

Promise.race([
  _promiseDoingRestCall(data),
  new Promise((resolve, reject) => setTimeout(() => reject(new Error("Timeout")), 30000)),
])