【问题标题】:How to tell if there are any pending (un-fulfilled) Promises on the page如何判断页面上是否有任何待处理(未完成)的 Promise
【发布时间】:2019-11-12 21:49:55
【问题描述】:

我的页面上有各种执行各种 JavaScript Promise 的组件。

在任何给定时间,我都想知道还有多少 Promise 处于未决状态(或者至少在计数为 0 或 > 0 时)。

我看到 Promise.all() 被用作建议,但这些承诺并不是同时触发的,因此不会通过一次调用 Promise.all() 来创建它们

如果可能,我还想避免使用 jQuery,并探索任何原生 ES6 解决方案。

【问题讨论】:

标签: javascript ecmascript-6 promise es6-promise


【解决方案1】:

Chrome has queryObjects(Promise) 现在,这是一个有点尴尬的 API,但似乎至少适用于您提出的字面问题:

> queryObjects(Promise)
undefined
Array(2)

展开它记录的数组以检查每个promise的状态,或右键单击它并选择存储为全局变量以便能够Promise.all()它。

我不知道 Firefox 有什么类似的东西。

【讨论】:

  • 值得一提的是,这仅适用于 chrome 控制台,因为它应该用于并且应该仅用于调试目的。
  • @JonasWilms:哦,是的,当然。这样做(无论如何,不​​仅仅是queryObjects)作为正常程序流程的一部分将是一个设计缺陷。
  • 如果可能的话,我还想避免使用 jQuery 并探索任何原生 ES6 解决方案。 表明这正是 OP 正在尝试做的......
【解决方案2】:

要跟踪特定的一组承诺,您可以使用一个小助手,例如:

 const promiseTracker = () => ({
     count: 0,
     get isActive() { return this.count === 0; },
     track(p) {
        this.count += 1;
        p.then(() => this.count -= 1, () => this.count -= 1);
     }
 });

这可以用作:

 const networkCalls = promiseTracker();

 networkCalls.track(fetch(/*...*/));
 //...

 console.log(networkCalls.isActive); // ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    相关资源
    最近更新 更多