首页 > 解决方案 > Promise 包装在 catch 子句中并在 Promise.all 中等待

问题描述

  1. 承诺的文档状态.catch()返回一个承诺。这是否意味着如果您在代码中返回一个 Promise,它将被包装在 .catch 的另一个 Promise 中?

IE

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

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

  1. 如果将上面变量 x 中的承诺放入现有数组并传递给Promise.all(),那么什么会构成被解析?在 Promise.all 解决之前,catch 块和内部函数是否必须完成?如果是这样,为什么会这样?为什么 Promise.all 不会在第一个 Promise.reject() 执行后立即解决?它怎么知道等待?

标签: javascriptpromisees6-promisepromise.all

解决方案


  1. 是的,不是的......涉及多个承诺,但它们是链接在一起的,没有相互包裹,或者在最终的承诺中“承担”(实际的短语是“采用”)Promise.resolve("test")在你的情况下的价值,所以,你得到的是一个单一的承诺,它解决(在这种情况下,解决)价值"test"
  2. 5个答案是:
  • 是的,解决了
  • 是的,因为 x 是该表达式返回的最终承诺
  • 因为 x 是该表达式返回的最终承诺,所以其他 Promise 对 Promise.all 都不“可见”,
  • 因为 x 是该表达式返回的最终承诺,所以其他承诺对 x 不“可见”
  • 这就是 Promise 链的工作方式,没有等待,它只是 Promise 链在工作

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


推荐阅读