有人在使用基于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)
}
控制台中没有错误
答案 0 :(得分:0)
事实证明,添加this._promise = promise
以确保将诺言保存在内存中可以修复该错误。
还有delete this._promise
,然后再解决它。
基于这个事实,我认为chrome更新针对该特定情况引入了更具攻击性的垃圾收集。
奇怪的是,调用resolve
不会引发任何错误,并且在进行await
并可靠引用resolve
时,Promise显然是垃圾回收。