Fates and States Promises - 解决状态指的是什么?

问题描述 投票:0回答:3

我对解决的“状态”感到困惑,我不明白这些文本指的是什么。

https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md

命运

Promise 有两种可能的相互排斥的命运:resolved 和 未解决。

  • 承诺已解决如果尝试解决或拒绝它没有效果,即承诺已被“锁定”以跟随另一个 承诺,或已履行或拒绝。
  • 如果未解决,则承诺未解决,即如果试图解决或拒绝它会对承诺产生影响。

一个 promise 可以被“解决”为一个 promise 或 thenable,其中 case 它将存储 promise 或 thenable 以供以后解包;或者它 可以解析为非承诺值,在这种情况下它已实现 具有该值。

粗体字(无效是什么意思?)指的是什么?我很困惑

javascript asynchronous promise
3个回答
2
投票

Trying to resolve or reject”是指调用

resolve
reject
函数。根据承诺的状态,他们要么解决并分别拒绝承诺,要么他们“没有任何影响”(或:影响)对承诺。

我们可以通过使用

resolve
一次来解决承诺,然后尝试再次调用
resolve()
或尝试调用
reject()
:

来证明这一点
function demo(result) {
  new Promise((resolve, reject) => {
    resolve(result); // this resolves the promise

    resolve("update!"); // this has no effect
    reject(new Error("update")); // nor does this
  }).then(value => {
    console.log(`the promise was fulfilled to ${value}`);
  }, reason => {
    console.log(`the promise was rejected with ${reason}`);
  });
}
demo(1);
demo(Promise.reject(new Error("final")));
demo(new Promise(resolve => { setTimeout(resolve, 500, "delay"); }));

1
投票

promise 的一个重要属性是它们只能解析一次。一旦承诺被解决,任何以不同方式解决它的尝试都将被忽略(它对承诺的状态没有影响)。

例如:

  • 如果一个 promise 以 3 的值实现,而你试图以 19 的值实现它,它不会有任何效果。如果你试图拒绝它,它不会有任何效果。如果您尝试将其锁定到另一个 promise,它将无效。在所有这些场景中,承诺将保持价值 3 的履行。

  • 如果 promise 因“错误”而被拒绝,而你试图实现它,它不会有任何效果。如果您尝试以不同的原因“另一个错误”拒绝它,则 if 将无效。如果您尝试将其锁定到另一个 promise,它将无效。在所有这些情况下,承诺将以“错误”为由被拒绝。

  • 如果一个 promise 被锁定在另一个 promise 上,而你试图实现它,它不会有任何效果。如果你试图拒绝它,它不会有任何效果。如果您尝试将其锁定到 another 承诺而不是它所锁定的承诺,它将无效。在所有这些场景中,promise 将保持锁定到它被锁定的第一个 promise。

请参阅ECMA 脚本规范中术语resolvedfulfilledrejectedpendinglocked-in的定义。

注意:当一个承诺被另一个承诺解决时,它就会被锁定。由于第二个承诺可能未决,因此第一个承诺已解决,但仍未决。


-4
投票

我换个说法:承诺是

  • 待定
  • 或定居,其中有两种子情况:
    • 要么满足
    • 或拒绝。

你引用的文字称“未解决”我称之为“待定”,“已解决”我称之为“已解决”。

当你构建一个承诺时

var promise = new Promise(function(resolve, reject) {
  // handle asynchronous operations here
  // resolve successful values
  // reject errors
  // ...
});

一开始是pending。当在异步代码中分别调用函数

resolve
reject
时,它就确定了,即解决或拒绝了。

但是一旦它被解决,状态就不能再改变了:如果异步代码先调用

resolve()
,然后调用
reject()
,它就会让promise resolved。这就是引用的文字想要表达的。

注意 Promise 构造函数中的代码实际上是同步运行的。

const p = new Promise((resolve, reject) => {
  console.log(1)
  resolve(2)
  console.log(3)
})

console.log(4)
p.then(console.log)
console.log(5)

1
3
4
5
2
© www.soinside.com 2019 - 2024. All rights reserved.