为什么已解决的承诺仍处于未决状态?
Why a resolved promise still in pending state?
示例:
let a = Promise.resolve("123")
.then(val => {
console.log(a);
return 100;
})
.then(val => {
console.log(val);
console.log(a);
})
.finally(() => {
console.log(a);
});
输出:
Promise { <pending> }
100
Promise { <pending> }
Promise { <pending> }
为什么已解决的承诺仍处于待定状态?
因此,a
包含执行所有这些的结果:
let a = Promise.resolve(...).then(...).then(...).finally(...);
该阶段的每一步都会创建一个新的承诺,a
包含链中的最后一个承诺(最后一个承诺是 .finally()
returns 的承诺)。每次您记录 a
,您都在记录最终的承诺,并且在链完成之前尚未解决。
请记住,所有这些 .then()
和 .finally()
方法都会立即执行,并且每个 returns 都是一个新的承诺。当它们执行时,它们会注册传递给它们的回调,以便稍后在与它们关联的承诺解决或拒绝时调用这些回调。即使第一个承诺立即得到解决,它仍然不会执行它的 .then()
处理程序,直到整个 .then().then().finally()
链执行并且该链中的所有承诺都被创建并且所有处理程序都在其中指定链已注册。因此,a
包含 .finally()
returns 的第四个承诺,而不是 Promise.resolve()
创建的第四个承诺,并且直到链中的所有处理程序完成后才解决第四个承诺执行。由于您正在从所有这些处理程序中进行日志记录,这就是为什么链中的最后一个承诺在您记录它的任何地方仍然显示为 pending
。
如果你像这样以不同的方式做事:
let d = Promise.resolve("123");
d.then(val => {
console.log(d);
return 100;
}).then(val => {
console.log(val);
console.log(d);
}).finally(() => {
console.log(d);
});
然后,你会看到这个:
Promise { '123' }
100
Promise { '123' }
Promise { '123' }
因为现在 d
代表链中的第一个承诺,而不是链中的最后一个承诺,所以当所有其他处理程序执行时它确实已解决。
因此,您可能没有意识到的操作部分是每个 .then()
、.catch()
或 .finally()
returns 一个新的承诺它前面的链条。您原来的 console.log(a)
仅监控链中的最后一个承诺,而不是链中的第一个承诺或链中的当前承诺。
示例:
let a = Promise.resolve("123")
.then(val => {
console.log(a);
return 100;
})
.then(val => {
console.log(val);
console.log(a);
})
.finally(() => {
console.log(a);
});
输出:
Promise { <pending> }
100
Promise { <pending> }
Promise { <pending> }
为什么已解决的承诺仍处于待定状态?
因此,a
包含执行所有这些的结果:
let a = Promise.resolve(...).then(...).then(...).finally(...);
该阶段的每一步都会创建一个新的承诺,a
包含链中的最后一个承诺(最后一个承诺是 .finally()
returns 的承诺)。每次您记录 a
,您都在记录最终的承诺,并且在链完成之前尚未解决。
请记住,所有这些 .then()
和 .finally()
方法都会立即执行,并且每个 returns 都是一个新的承诺。当它们执行时,它们会注册传递给它们的回调,以便稍后在与它们关联的承诺解决或拒绝时调用这些回调。即使第一个承诺立即得到解决,它仍然不会执行它的 .then()
处理程序,直到整个 .then().then().finally()
链执行并且该链中的所有承诺都被创建并且所有处理程序都在其中指定链已注册。因此,a
包含 .finally()
returns 的第四个承诺,而不是 Promise.resolve()
创建的第四个承诺,并且直到链中的所有处理程序完成后才解决第四个承诺执行。由于您正在从所有这些处理程序中进行日志记录,这就是为什么链中的最后一个承诺在您记录它的任何地方仍然显示为 pending
。
如果你像这样以不同的方式做事:
let d = Promise.resolve("123");
d.then(val => {
console.log(d);
return 100;
}).then(val => {
console.log(val);
console.log(d);
}).finally(() => {
console.log(d);
});
然后,你会看到这个:
Promise { '123' }
100
Promise { '123' }
Promise { '123' }
因为现在 d
代表链中的第一个承诺,而不是链中的最后一个承诺,所以当所有其他处理程序执行时它确实已解决。
因此,您可能没有意识到的操作部分是每个 .then()
、.catch()
或 .finally()
returns 一个新的承诺它前面的链条。您原来的 console.log(a)
仅监控链中的最后一个承诺,而不是链中的第一个承诺或链中的当前承诺。