Promise.all 如果将第二个承诺添加到承诺数组,则不会解析
Promise.all is not resolving if second promise is added to promise array
鉴于 promise1 和 promise2 已使用以下代码正确解析:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = await getPayment(payments[0].paymentId)
const promise2 = await getPayment(payments[1].paymentId)
const results = [promise1, promise2]
return results
}
任何人都可以帮助解释为什么下面的代码会挂起,承诺永远不会被解决或拒绝:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = getPayment(payments[0].paymentId)
const promise2 = getPayment(payments[1].paymentId)
const results = await Promise.all([promise1, promise2])
return results
}
可能还值得一提的是,当只有一个 promise 传递给 Promise.all 时,promise 会按预期解决,下面的代码也可以正常工作:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = getPayment(payments[0].paymentId)
const results = await Promise.all([promise1)
return results
}
尝试这样的事情,而不是将函数的结果分配给变量
const [results1, result2] = await Promise.all([
getPayment(payments[0].paymentId),
getPayment(payments[1].paymentId)
])
这在很大程度上取决于 getPayment
内部发生的情况。一般来说,你的第二个例子应该可以工作,但有些情况下不会发生这种情况,特别是如果两个 getPayment
调用,由于一些内部操作等待 each-other,导致死锁。
虽然根据您提供的信息,我们无法准确告诉您代码中发生了什么,但您应用的解决方案应该是确保 getPayment
调用永远不会导致死锁,如果它们是异步执行。
鉴于 promise1 和 promise2 已使用以下代码正确解析:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = await getPayment(payments[0].paymentId)
const promise2 = await getPayment(payments[1].paymentId)
const results = [promise1, promise2]
return results
}
任何人都可以帮助解释为什么下面的代码会挂起,承诺永远不会被解决或拒绝:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = getPayment(payments[0].paymentId)
const promise2 = getPayment(payments[1].paymentId)
const results = await Promise.all([promise1, promise2])
return results
}
可能还值得一提的是,当只有一个 promise 传递给 Promise.all 时,promise 会按预期解决,下面的代码也可以正常工作:
export const getExistingPayments = async (payments: Payment[]) => {
const promise1 = getPayment(payments[0].paymentId)
const results = await Promise.all([promise1)
return results
}
尝试这样的事情,而不是将函数的结果分配给变量
const [results1, result2] = await Promise.all([
getPayment(payments[0].paymentId),
getPayment(payments[1].paymentId)
])
这在很大程度上取决于 getPayment
内部发生的情况。一般来说,你的第二个例子应该可以工作,但有些情况下不会发生这种情况,特别是如果两个 getPayment
调用,由于一些内部操作等待 each-other,导致死锁。
虽然根据您提供的信息,我们无法准确告诉您代码中发生了什么,但您应用的解决方案应该是确保 getPayment
调用永远不会导致死锁,如果它们是异步执行。