Разрешен / завершен ли асинхронный код в сервис-воркере Manifest V3 в том же контексте выполнения, в котором он был инициирован?
У меня в расширении MV3 есть такой код:
import _ from 'lodash';
const storageKey = 'state';
let state;
(async () => {
state = await chrome.storage.local.get(storageKey);
listener();
})();
const update = async (data) => {
await chrome.storage.local.set({[storageKey]: data});
}
let lastPick;
const listener = async () => {
const pick = _.pick(state, ...);
if (_.isEqual(pick, lastPick))
return;
lastPick = pick;
...
// do some stuff
}
chrome.storage.onChanged.addListener((changes, area) => {
if (area !== 'local' || !(storageKey in changes))
return;
const {newValue} = changes[storageKey];
state = newValue;
listener();
});
chrome.tabs.onActivated.addListener(async (data) => {
...
update(...);
...
update(...);
...
update(...);
});
С классическим расширением Manifest V2 я мог быть уверен, что значение
lastPick
будет всегда сохраняться через вызовы (что, в свою очередь, вызвано множественными
update
звонков), поэтому логика "кое-чего" внутри
listener
не сломается.
Но как насчет Manifest V3, а точнее его сервис-воркеров? Могу ли я быть уверен, что приведенная выше логика не нарушится?
1 ответ
Do not register listeners asynchronously, as they will not be properly triggered.
Надеюсь, это будет полезно для вас.