异步Promise阻止DOM

时间:2018-07-24 06:53:04

标签: javascript performance asynchronous dom promise

异步承诺不能按我期望的那样工作(特别是React,但是我认为这将适用于其他情况)。他们似乎仍然阻塞了主线程,实质上冻结了我的浏览器。

我有处理按钮单击的方法:

onClick() {
  console.time('factorial')
  factorial(8000) // factorial is the culprit!
    .then(n => this.setState({ n }))
  console.endTime('factorial')
}

factorial返回一个promise,因此,按预期,我在控制台中得到了factorial: 2ms。但是,该网页挂起。在查看性能指标时,这也很明显:

promise callback taking 700+ ms, blocking the DOM

Promise需要700毫秒以上的时间来评估,并且在整个持续时间内,DOM似乎都被阻止了。这完全使我感到困惑,因为我希望DOM能够继续下去。如何获得factorial函数以不阻止DOM?

1 个答案:

答案 0 :(得分:2)

异步函数不是线程。

当他们等待JavaScript事件循环之外的事件发生时(例如到达HTTP响应),他们会暂停并进入后台。

它们正在运行时,它们仍在运行,并且像其他任何函数一样捆绑事件循环。

如果要将某些处理分流到另一个线程,则需要使用Web Workers。 (至少在网络浏览器中)。