Мне нужно обновлять некоторые данные каждый раз, когда срабатывает определенное событие браузера (например, когда закрывается вкладка браузера):
chrome.tabs.onRemoved.addListener(async (tabId) => {
let data = await getData(); // async operation
... // modify data
await setData(data); // async operation
});
Проблема в том, что когда несколько таких событий запускаются быстро, асинхронный c getData()
может вернуть устаревший результат при последующем вызове обработчика событий до того, как setData()
получит шанс завершить sh в более ранних, что приведет к несогласованному результату.
Если обработчик событий может выполнить синхронно, то эта проблема не возникнет, но getData()
и setData()
оба являются асинхронными c операциями.
Это состояние гонки? Какой рекомендуемый шаблон для обработки этого типа logi? c?
--- Обновление ---
Чтобы предоставить больше контекста, getData()
и setData()
являются просто обещанной версией некоторого Chrome API хранилища:
async function getData() {
return new Promise(resolve => {
chrome.storage.local.get(key, function(data) => {
// callback
});
});
}
async function setData() {
return new Promise(resolve => {
chrome.storage.local.set({ key: value }, function() => {
// callback
});
});
}
Я заключил вызов API в Promise для удобства чтения, но я думаю, что это асинхронный c op в любом случае?