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 调用永远不会导致死锁,如果它们是异步执行。