【发布时间】:2017-01-04 23:37:10
【问题描述】:
如果 Promise p 使用 Promise(或 Thenable)q 的值解析,则它本质上成为 Promise q 的副本。如果q 被解析,p 将被解析为相同的值。
Promise.resolve(Promise.resolve("hello"));
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "hello"}
如果q 被拒绝,p 将被拒绝并使用相同的值。
Promise.resolve(Promise.reject(new Error("goodbye")));
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: Error: goodbye}
Promise p 通过 Promise q 解决/拒绝,而不是直接使用相应的值这一事实与最终结果无关。中间 Promise 作为解析过程的一部分被消耗,并且对消费者不可见。
如果q 是从未解决或拒绝的,p 也将永远保持等待状态。
Promise.resolve(new Promise(() => null)); // perpetually-pending promise
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
这些情况众所周知,但我从未见过如果一个 Promise 被另一个 Promise 值rejected(而不是解决)会发生什么。拒绝过程是否也消耗了中间的 Promise,还是原封不动地通过了?
如果它确实消耗了它们,那它是如何工作的?
【问题讨论】:
-
这并不难测试自己,但我前几天试图快速查找这种行为,在搜索中找不到答案,所以我决定发帖。
-
不确定问题是什么?
-
@guest271314:没有。帖子里有三个带问号的句子。阅读它们。没有问题,他只是想了解会发生什么。
-
“我从未见过会发生什么” - 有充分的理由。 A Promise.reject message should always be wrapped in an Error.
-
"如果 q 被解析,p 将被解析并具有相同的值。"是一个陷阱!它应为“如果 q 满足,p 将 满足 具有相同的值”。
标签: javascript promise