Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS承诺:实现vs解决_Javascript_Promise - Fatal编程技术网

Javascript JS承诺:实现vs解决

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

我理解承诺存在于三种状态之一:承诺可以是待决的(未解决),履行的(成功解决)或被拒绝的(未成功解决)

通过阅读and,我感到困惑的是,它们都承认已履行拒绝状态,但在承诺构造函数的定义中,它们指定了两个回调:解析拒绝。我们似乎在交替使用这两个术语;事实并非如此

并不意味着成功:

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));