每次触发某些浏览器事件时(例如,当浏览器选项卡关闭时),我都需要更新一些数据:
chrome.tabs.onRemoved.addListener(async (tabId) => {
let data = await getData(); // async operation
... // modify data
await setData(data); // async operation
});
问题是,当多个此类事件触发器快速连续时,异步getData()可能会在事件处理程序的后续调用中返回陈旧的结果,然后setData()才有机会在较早的事件中完成,从而导致结果不一致。
如果事件处理程序可以同步执行,则不会发生此问题,但getData()两者setData()都是异步操作。
这是比赛条件吗?处理此类逻辑的推荐模式是什么?
- - 更新 - -
为了提供更多上下文,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 中,但我认为无论哪种方式都是异步操作?
函数式编程
相关分类