Разрешен / завершен ли асинхронный код в сервис-воркере 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.

https://developer.chrome.com/docs/extensions/mv3/service_workers/#:~:text=Do%20not%20register%20listeners%20asynchronously%2C%20as%20they%20will%20not%20be%20perly%20triggered.

Надеюсь, это будет полезно для вас.

Другие вопросы по тегам