如何判断承诺是否已解决?

tru*_*ktr 9 javascript promise

假设有些代码可以

// promise.js
let p = new Promise(() => { /* ... */ })
export default p
Run Code Online (Sandbox Code Playgroud)

PromiseES6承诺在哪里?假设其他一些代码只有引用p.该代码如何判断是否p已解决?

// other.js
import p from './promise.js'
// console.log('p is resolved?', ______)
Run Code Online (Sandbox Code Playgroud)

是否有什么我们可以填补空白,这将显示真或假,取决于承诺是否得到解决?

ash*_*ish 14

引用MDN文档:

按照设计,不能在不调用then()方法的情况下从代码中同步检查promise的即时状态和值.

所以,你需要调用该.then方法.


nst*_*sev 12

ES6 Promise构造函数没有可以告诉您promise的状态的属性.你需要做这样的事情:

import p from './promise.js'
var isResolved = false;
p.then(function() {
  isResolved = true;
});

// ... At some point in the future.
console.log('p is resolved?', isResolved);
Run Code Online (Sandbox Code Playgroud)

有一个内部属性,PromiseState但您无法访问它.这是规格.

  • 这将始终返回 false。将 console.log 放在 'then' import p from './promise.js' var isResolved = false; p.then(function() { isResolved = true; console.log('p 被解决了吗?', isResolved); }); (6认同)
  • 作为熟悉浏览器如何工作的人,我理解评论"......在未来的某个时刻."但如果我是JavaScript的新手,我想我可能会误以为如果把`for(让i = 0; i <1000000; ++ i);`在日志之前,它会以某种方式返回true,如同书面的那样.(很明显,除非代码退出当前事件,否则永远不会成立) (3认同)
  • 帮我在这里纠正自己.为什么你认为这总是会返回假? (2认同)
  • 因为 javascript 是异步的,即使在 promise 被解决之前也会执行 console.log 并且当时 isResolved 具有 'false' 值 (2认同)
  • 是的,你是对的.但我希望在定义`then`处理程序和调用`console.log`的那一刻之间有一些代码执行.我想这个问题的作者希望能够总是告诉我们这个承诺是否已经完成.在任何时间点,如果未解决承诺,则isResolved将为false.对? (2认同)
  • *对吗?*不,错了。如果您的意思是在调用 `p.then` 和 `console.log` 之间有一个“勾号”,那么实际上并没有。`console.log` 将在 `p.then` 之后立即执行,在处理程序有机会执行之前,因为直到下一个时钟周期才会发生。 (2认同)