我对解决的“状态”感到困惑,我不明白这些文本指的是什么。
https://github.com/domenic/promises-unwrapping/blob/master/docs/states-and-fates.md
命运
Promise 有两种可能的相互排斥的命运:resolved 和 未解决。
- 承诺已解决如果尝试解决或拒绝它没有效果,即承诺已被“锁定”以跟随另一个 承诺,或已履行或拒绝。
- 如果未解决,则承诺未解决,即如果试图解决或拒绝它会对承诺产生影响。
一个 promise 可以被“解决”为一个 promise 或 thenable,其中 case 它将存储 promise 或 thenable 以供以后解包;或者它 可以解析为非承诺值,在这种情况下它已实现 具有该值。
粗体字(无效是什么意思?)指的是什么?我很困惑
“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"); }));
promise 的一个重要属性是它们只能解析一次。一旦承诺被解决,任何以不同方式解决它的尝试都将被忽略(它对承诺的状态没有影响)。
例如:
如果一个 promise 以 3 的值实现,而你试图以 19 的值实现它,它不会有任何效果。如果你试图拒绝它,它不会有任何效果。如果您尝试将其锁定到另一个 promise,它将无效。在所有这些场景中,承诺将保持价值 3 的履行。
如果 promise 因“错误”而被拒绝,而你试图实现它,它不会有任何效果。如果您尝试以不同的原因“另一个错误”拒绝它,则 if 将无效。如果您尝试将其锁定到另一个 promise,它将无效。在所有这些情况下,承诺将以“错误”为由被拒绝。
如果一个 promise 被锁定在另一个 promise 上,而你试图实现它,它不会有任何效果。如果你试图拒绝它,它不会有任何效果。如果您尝试将其锁定到 another 承诺而不是它所锁定的承诺,它将无效。在所有这些场景中,promise 将保持锁定到它被锁定的第一个 promise。
请参阅ECMA 脚本规范中术语resolved、fulfilled、rejected、pending和locked-in的定义。
注意:当一个承诺被另一个承诺解决时,它就会被锁定。由于第二个承诺可能未决,因此第一个承诺已解决,但仍未决。
我换个说法:承诺是
你引用的文字称“未解决”我称之为“待定”,“已解决”我称之为“已解决”。
当你构建一个承诺时
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