【问题标题】:How to tell if a promise is resolved? [duplicate]如何判断承诺是否已解决? [复制]
【发布时间】:2016-06-13 11:30:10
【问题描述】:

假设某些代码可以

// promise.js
let p = new Promise(() => { /* ... */ })
export default p

Promise 是一个 ES6 Promise。假设其他一些代码只引用了p。该代码如何判断p 是否已解决?

// other.js
import p from './promise.js'
// console.log('p is resolved?', ______)

有什么我们可以填空的东西,根据承诺是否得到解决,它会显示真假吗?

【问题讨论】:

    标签: javascript promise


    【解决方案1】:

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

    有一个名为PromiseState 的内部属性,但您无法访问它。 Here is the spec.

    【讨论】:

    • 这将始终返回 false。将 console.log 放入 'then' import p from './promise.js' var isResolved = false; p.then(function() { isResolved = true; console.log('p 已解决?', isResolved); });
    • 帮助我在这里更正自己。为什么你认为这总是会返回 false?
    • 因为 javascript 是异步的,并且会在 promise 被解析之前执行 console.log 并且此时 isResolved 的值为 'false'
    • 是的,你是对的。但我希望在定义then 处理程序的那一刻和调用console.log 的那一刻之间会有一些代码执行。我想问题的作者希望能够始终判断承诺是否完成。如果 promise 没有解决,那么在任何时候 isResolved 都会是 false。对吗?
    • 作为熟悉浏览器工作原理的人,我理解评论 ... At some point in the future. 但如果我是 JavaScript 新手,我想我可能会误以为如果将 for (let i =0; i < 1000000; ++i); 放在日志之前它会以某种方式如所写返回true。 (要明确的是,除非代码退出当前事件,否则它永远不会是真的)
    【解决方案2】:

    引用 MDN 文档:

    根据设计,如果不调用 then() 方法,就无法从代码同步检查 Promise 的即时状态和值。

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

    【讨论】:

    • 两个答案都很好,所以我扔了一枚硬币,结果落在了另一个答案上。不过感谢您的回答!
    猜你喜欢
    • 2014-02-24
    • 2014-04-28
    • 2015-09-22
    • 1970-01-01
    • 2018-04-02
    • 2022-06-10
    • 1970-01-01
    • 2020-09-07
    • 2015-06-09
    相关资源
    最近更新 更多