异步承诺不能按我期望的那样工作(特别是React,但是我认为这将适用于其他情况)。他们似乎仍然阻塞了主线程,实质上冻结了我的浏览器。
我有处理按钮单击的方法:
onClick() {
console.time('factorial')
factorial(8000) // factorial is the culprit!
.then(n => this.setState({ n }))
console.endTime('factorial')
}
factorial
返回一个promise,因此,按预期,我在控制台中得到了factorial: 2ms
。但是,该网页挂起。在查看性能指标时,这也很明显:
Promise需要700毫秒以上的时间来评估,并且在整个持续时间内,DOM似乎都被阻止了。这完全使我感到困惑,因为我希望DOM能够继续下去。如何获得factorial
函数以不阻止DOM?
答案 0 :(得分:2)
异步函数不是线程。
当他们等待JavaScript事件循环之外的事件发生时(例如到达HTTP响应),他们会暂停并进入后台。
它们正在运行时,它们仍在运行,并且像其他任何函数一样捆绑事件循环。
如果要将某些处理分流到另一个线程,则需要使用Web Workers。 (至少在网络浏览器中)。