Ожидание не вернулось после обновления Chromium - PullRequest
0 голосов
/ 21 мая 2019

У кого-нибудь была такая проблема с последними версиями браузеров на базе Chromium?

Мое приложение работало в предыдущих версиях и работает на Firefox.Но теперь происходит сбой из-за одного ожидающего вызова, который никогда не возвращает ответ.

Журналы показывают, что должна быть вызвана функция разрешения ожидаемого обещания.

Я признаю, что мой коднемного особенным, но я проверил все и не вижу причин, почему он должен потерпеть неудачу.Он использует веб-работника довольно интенсивно в течение пары секунд.

Иногда все это работает даже в 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 голосов
/ 21 мая 2019

Оказывается, что добавление this._promise = promise для сохранения обещания в памяти устраняет ошибку. И delete this._promise до его разрешения.

Основываясь на этом факте, я предполагаю, что обновление chrome представило более агрессивную сборку мусора для этого конкретного случая.

Странно, что вызов resolve не выдает никакой ошибки, и что Обещание, по-видимому, является сборщиком мусора, когда идет await, И твердая ссылка на resolve.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...