我理解Promise存在于以下三种状态之一:Promise可以是 pending (未解析), fulfilled (已成功解析)或 rejected (已解决失败) .
通过阅读A+ Promise Spec和MDN's documentation,我很困惑他们都承认 fulfilled 和 rejected 状态,但在Promise构造函数的定义中,它们指定了两个回调: resolve 和 reject . 我们似乎可以互换地使用这两个术语;他们不是 .
并不意味着成功:
re·solve /rəˈzälv/ verb
1. settle or find a solution to (a problem, dispute, or contentious matter).
是否意味着成功:
ful·fill /fo͝olˈfil/ verb
1. bring to completion or reality; achieve or realize (something desired, promised, or predicted).
2. carry out (a task, duty, or role) as required, pledged, or expected.
当我们实际承诺时,为什么我们在这里使用_2479860?是否有一个实例,我们传递给 resolve 的值可能会导致Promise被 reject 编辑?
3 回答
我们可以用另一个承诺来解决承诺 .
首先回答你的第二个问题:是的,有一个实例,我们传递给它的值可能导致Promise被拒绝,也就是说,如果我们传递一个被拒绝的承诺,例如
Promise.reject()
.回答你的第一个问题是没有解决问题并且完成相同的事情:考虑我们传递给要解决的 Value 是未决承诺的情况 . 在这种情况下,我们自己的承诺将立即结果:
在这种情况下,我们说承诺是“解决”另一个承诺,它仍然悬而未决 .
这一切都发生在
then
的背后,因此可能更容易看一下a
不支持promises(采取回调)的复古案例,而且我们没有正确地展平事物:在这里,我们更清楚地看到,决心被另一个承诺所呼唤 . 重要的是,已解决的承诺不会实现并触发
"after setTimeout"
消息,直到第二个承诺结算(来自setTimeout
的非承诺undefined
值),此时两个承诺都会得到满足(换句话说:这两个承诺刚刚形成resolve chain) .这是理解已解决的不同于履行或甚至解决(履行或拒绝,未待决)的关键 .
来自States and Fates:
州:履行,拒绝,待决 .
命运:已解决,尚未解决 .
命运指的是单一承诺的命运是否已达到,并且由于解决链而不直接对应于任何状态转变 .
我认为,承诺已经解决或解决了,这是很常见的 . 承诺的解决方案是承诺从
pending
状态移动并获取与所述状态相关联的值的过程 . 因此,如果承诺是fulfilled
或rejected
,它将是一个已解决的承诺(因为它的解决过程已经结束) . 如果承诺进入解决过程并且从未转换到任何其他状态,则表示承诺未解决(解决过程从未结束) .关于其他术语
rejected
或fulfilled
,它们是pending
承诺可以转换的另外两个状态 .reject
是非常明显的IMO,它处理应该发生故障的情况 . 现在我同意fulfill
可能有些含糊不清,因为它可能只是意味着承诺已成功完成(如在解决中) . 它不应该描述解决过程,而是描述手头任务的成功(或没有错误) .解决过程(解决承诺)可以在A+ spec中查看 .
Edit .
为什么人们通常使用
resolve
作为第一个参数名称's because the callback passed as the first argument invokes the resolution process. It doesn' t履行承诺(承诺仍然可以被拒绝),它只是开始解决承诺 .reject
机制未在规范中指定,它实际上是一种短路解决方案的过程,因此承诺用reject
解决(实际上没有解决) .以下是使用
resolve
拒绝p
的一些示例:这是2.3.1 .
这是2.3.2.3 .
这是2.3.3.2 .
这是2.3.3.3.3
这是2.3.3.4.2
我在这里使用
Promise.resolve
而不是传递给Promise构造函数的函数的第一个参数,但它们应该是相同的 . 很多时候传递给构造函数的resolve
函数是:您当然可以将这些测试记录为:
具有
Error
值的已解决Promise
不会自动转换Promise
拒绝Promise
另见States and fates
不确定使用
resolve
拒绝Promise
的原因或预期结果?虽然最简单的方法是在resolve
调用Promise.resolve(Promise.reject(/* Error here */))
时将reject
作为参数传递如果预期结果是捕获错误或被拒绝
Promise
传递给resolve
哪里可以附加处理程序,同时保持"resolved"
PromiseStatus
,可以直接使用unhandledrejection
事件,Promise.reject
或者铬/铬49可以使用PromiseRejectionEvent
也可以在
Promise
构造函数中使用throw
Error
而不使用resolve
或reject
,这应该由onRejected
或catch
处理说明:根据应用程序和预期结果,有许多方法可以处理已解决和拒绝的对象.2479933_对象 .