Javascript JS承诺:实现vs解决
我理解承诺存在于三种状态之一:承诺可以是待决的(未解决),履行的(成功解决)或被拒绝的(未成功解决) 通过阅读and,我感到困惑的是,它们都承认已履行和拒绝状态,但在承诺构造函数的定义中,它们指定了两个回调:解析和拒绝。我们似乎在交替使用这两个术语;事实并非如此 并不意味着成功:Javascript JS承诺:实现vs解决,javascript,promise,Javascript,Promise,我理解承诺存在于三种状态之一:承诺可以是待决的(未解决),履行的(成功解决)或被拒绝的(未成功解决) 通过阅读and,我感到困惑的是,它们都承认已履行和拒绝状态,但在承诺构造函数的定义中,它们指定了两个回调:解析和拒绝。我们似乎在交替使用这两个术语;事实并非如此 并不意味着成功: re·solve /rəˈzälv/ verb 1. settle or find a solution to (a problem, dispute, or contentious matter). ful·fil
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.
这意味着成功:
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.
当我们实际履行承诺时,为什么在这里使用解决?是否存在这样一种情况,即我们传递给resolve的值可能导致承诺被拒绝ed?具有
错误值的已解决承诺不会自动将承诺转换为已拒绝的承诺
var p=Promise.resolve(新错误(“拒绝”);
p、 然后(函数(数据){
console.log(数据,p)
})
我认为通常会说承诺已经解决或解决。承诺的解析是承诺从挂起
状态移动并获取与所述状态相关联的值的过程。因此,如果一个承诺是履行的
或被拒绝的
,它将是一个已解决的承诺(因为它的解决过程已经结束)。如果承诺进入解决过程,并且从未转换到任何其他状态,则表示承诺未解决(解决过程从未结束)
关于其他条款被拒绝
或履行
,它们是未决
承诺可以从中转换的其他两种状态<代码>拒绝
在IMO中非常明显,它处理应该发生故障的情况。现在我同意,履行
可能有点模棱两可,因为这可能仅仅意味着承诺已成功完成(如在解决中)。它不应该描述解决过程,而是描述手头任务的成功(或没有错误)
可以在中观察解决过程(解决承诺)
编辑
人们通常使用resolve
作为第一个参数名的原因是,作为第一个参数传递的回调调用了解析过程。它没有履行承诺(承诺仍然可以被拒绝),它只是开始解决承诺。拒绝
机制未在规范中指定,它实际上有点短路了解决过程,因此承诺通过拒绝
解决(您看到的不是实际解决)
以下是一些使用resolve
拒绝p
的示例:
这是重点
这是重点
这是重点
这是重点
这是重点
我在这里使用了Promise.resolve
,而不是传递给Promise构造函数的函数的第一个参数,但它们应该是相同的。很多时候,传递给构造函数的resolve
函数是:
var p = this;
var cb = function(x){
resolve(p, x);
}
当然,您可以将这些测试记录为:
var p = new Promise(function(resolve){
resolve(thenable);
});
我们可以用另一个承诺来解决一个承诺
首先回答你的第二个问题:是的,有一个例子,我们传递给解析的值可能会导致承诺被拒绝,也就是说,如果我们传递一个被拒绝的承诺,例如Promise.reject()
回答你的第一个问题不是解决和履行同样的问题:考虑我们通过解决的价值是一个悬而未决的承诺的情况。在这种情况下,我们自己的承诺不会立即解决:
a().then(() => new Promise(setTimeout)).catch(e => console.error(e));
在这种情况下,我们说一个承诺是“决定”另一个承诺,它仍然悬而未决
这一切都发生在我们背后的内部,然后,因此我们可以更容易地看到一个经典案例,其中a
不支持承诺(接受回调),并且我们没有正确地将事情扁平化:
// Old times and unflattened for exposition:
new Promise((resolve, reject) => a(function(result) {
resolve(new Promise(setTimeout));
}, reject))
.then(() => console.log("after setTimeout"))
.catch(e => console.error(e));
在这里,我们更清楚地看到,决心需要另一个承诺。重要的是,解析的承诺在第二个承诺解析之前(使用setTimeout
中的非承诺未定义的值),不会实现并触发“after setTimeout”
消息,此时两个承诺都实现了(换句话说,这两个承诺刚刚形成了一个值)
这是理解“已解决”不同于“已完成”或“已解决”(已完成或已拒绝,而不是“待定”)的关键
发件人:
- 状态:已完成、已拒绝、待定
- 命运:已解决,未解决
命运是指单个承诺的命运是否已经实现,并且由于解析链的原因,不直接对应于任何状态转换。事实上,解析回调并不意味着承诺将得到履行
已履行、拒绝、未决、已结算、已解决和锁定的条款在中定义
委员会:
任何承诺对象都处于三种相互排斥的状态之一:已履行、已拒绝和待决:
- 如果
p
实现了承诺p
,则(f,r)
将立即让作业排队以调用函数f
如果p,承诺p
将被拒绝。然后(f,r)
将立即使作业排队以调用函数r
如果承诺既没有履行也没有被拒绝,那么它就是待定的
如果一项承诺没有悬而未决,即履行或拒绝,则称之为已解决
如果某个承诺已结算或已“锁定”以匹配另一个承诺的状态,则该承诺将被解决。
试图解决或拒绝已解决的pr
var p = new Promise(function(resolve){
resolve(thenable);
});
a().then(() => new Promise(setTimeout)).catch(e => console.error(e));
// Old times and unflattened for exposition:
new Promise((resolve, reject) => a(function(result) {
resolve(new Promise(setTimeout));
}, reject))
.then(() => console.log("after setTimeout"))
.catch(e => console.error(e));