自Chromium更新以来未返回

时间:2019-05-21 12:44:49

标签: javascript google-chrome asynchronous async-await chromium

有人在使用基于Chromium的最新版本的浏览器时遇到了问题吗?

我的应用在以前的版本中可以使用,并且可以在Firefox中使用。但是现在由于一次等待呼叫而永不退缩会导致失败。

日志显示,应调用等待的Promise的resolve函数。

我承认我的代码有些特殊,但是我检查了所有内容,没有看到为什么它会失败的原因。它相当密集地使用了一个网络工作者,持续了几秒钟。

有时候整个事情甚至在Chrome上都可以正常运行,因此它可能是一个对时间敏感的错误。也许是由于垃圾收集造成的?

等待的承诺看起来像这样

if (this._closestFreePointResolve)
    throw new Error('busy')
console.log('created')
new Promise(resolve => {
    this._closestFreePointResolve = resolve
})

这是通过另一种方法解决的

if (!this._closestFreePointResolve)
    throw new Error('expected resolver')
const resolve = this._closestFreePointResolve
delete this._closestFreePointResolve
console.log('resolving')
resolve(val)

控制台输出如下:

已创建 解决 被创造 解决 ...(模式会重复并始终以已解决结束)

等待代码:

let a
try {
    a = await b(c)
} catch(err) {
    console.error(err)
}

控制台中没有错误

1 个答案:

答案 0 :(得分:0)

事实证明,添加this._promise = promise以确保将诺言保存在内存中可以修复该错误。 还有delete this._promise,然后再解决它。

基于这个事实,我认为chrome更新针对该特定情况引入了更具攻击性的垃圾收集。

奇怪的是,调用resolve不会引发任何错误,并且在进行await并可靠引用resolve时,Promise显然是垃圾回收。