javascript - Promise 包装在 catch 子句中并在 Promise.all 中等待
问题描述
- 承诺的文档状态
.catch()
返回一个承诺。这是否意味着如果您在代码中返回一个 Promise,它将被包装在 .catch 的另一个 Promise 中?
IE
const x = Promise.reject().catch(() => Promise.resolve("test"));
上述以“test”值解析的承诺是否会被包装在 .catch 的另一个承诺中?据我了解,这就是异步函数中发生的情况;他们将任何结果都包装在“幕后”的承诺中。这可能导致双重承诺,这是否也发生在这里?
- 如果将上面变量 x 中的承诺放入现有数组并传递给
Promise.all()
,那么什么会构成被解析?在 Promise.all 解决之前,catch 块和内部函数是否必须完成?如果是这样,为什么会这样?为什么 Promise.all 不会在第一个 Promise.reject() 执行后立即解决?它怎么知道等待?
解决方案
- 是的,不是的......涉及多个承诺,但它们是链接在一起的,没有相互包裹,或者在最终的承诺中“承担”(实际的短语是“采用”)
Promise.resolve("test")
在你的情况下的价值,所以,你得到的是一个单一的承诺,它解决(在这种情况下,解决)价值"test"
- 5个答案是:
- 是的,解决了
- 是的,因为 x 是该表达式返回的最终承诺
- 因为 x 是该表达式返回的最终承诺,所以其他 Promise 对 Promise.all 都不“可见”,
- 因为 x 是该表达式返回的最终承诺,所以其他承诺对 x 不“可见”
- 这就是 Promise 链的工作方式,没有等待,它只是 Promise 链在工作
您可能会发现Promise Resolution Procedure - 2.3.2有助于理解 Promise 的内部工作原理 - 2.3.2 特别处理在内部返回 Promise .then
......该解决过程的其余部分也很有启发性。
推荐阅读
- sass - Unknown pseudo selector 'export' in WebStorm
- javascript - 如何使用正则表达式忽略价格验证的 0 值?
- kubernetes - 如何巧妙地为 Helm 模板中的值列表定义 if 条件操作?
- c# - 如何将支付处理器的使用与 firebase 或 Auth0 登录结合使用?
- azure-devops - Azure DevOps query matching unassigned tasks?
- c++ - Qt's slot(?) inserts redundant namespace into connect
- cytoscape.js - 屏幕布局上的固定位置?
- java - How do I deserialize a series of application.properties to a Map in Java
- c# - How to convert this Oracle query to Linq?
- java - how can i extract ip from String in java