承诺包装在 catch 子句中并等待 Promise.all

Promise wrapping in catch clause and waiting in Promise.all

  1. promise 的文档指出 .catch()return 是一个 promise。这是否意味着如果您 return 代码中的一个承诺,它将包含在 .catch 的另一个承诺中?

const x = Promise.reject().catch(() => Promise.resolve("test"));

上述以“test”值解析的承诺是否会包含在 .catch 的另一个承诺中?据我了解,这就是异步函数中发生的事情;他们将结果包装在“引擎盖下”的承诺中。这可能会导致双重承诺,这是否也发生在这里?

  1. 如果将上述变量 x 中的承诺放入现有数组并传递给 Promise.all(),那么什么构成已解决? catch 块和内部函数是否必须在 Promise.all 解析之前完成?如果是这样,为什么会这样?为什么 Promise.all 不会在第一个 Promise.reject() 执行后立即解析?它怎么知道要等待?
  1. 是和不是……涉及多个承诺,但它们是链接在一起的,没有相互包裹,或者在最终承诺中“承担”(实际短语是“采用”)的价值Promise.resolve("test") 在你的情况下,所以,你得到的是一个单一的承诺,它解决(在这种情况下,解决)到值 "test"
  2. 5 个答案是:
  • 是的,已解决,
  • 是的,因为 x 是该表达式返回的最终承诺
  • 因为 x 是该表达式返回的最终承诺,none 的其他承诺对 Promise.all、
  • 是“可见的”
  • 因为 x 是该表达式返回的最终承诺,所以其他承诺对 x 不“可见”
  • 这就是 promise 链的工作方式,没有等待,只是 promise 链在工作

您可能会发现 The Promise Resolution Procedure - 2.3.2 有助于理解 Promises 的内部工作原理 - 2.3.2 专门处理在 .then 内部返回 Promise ...该解决过程的其余部分也很有启发性。