Ждите сбора данных из хранилища - PullRequest
0 голосов
/ 27 января 2019

Я борюсь с проблемой при сборе данных из хранилища.У меня есть слушатель события onMessage в фоновом скрипте, ожидающий определенного события.Если это событие получено - мне нужно собрать некоторые данные из storageArea и затем отправить их в скрипт контента.Моя проблема заключается в том, что мне нужно подождать, пока эти данные будут собраны (успешно или нет), и только затем продолжить и отправить данные.Если я пытаюсь отправить его из коллбэка storageArea - мой контент-скрипт ничего не получает.Если я просто продолжу -> скрипт продолжится и не будет ждать сбора данных, и снова мой скрипт контента не получит ничего.Ниже приведен псевдокод, иллюстрирующий мою проблему:

browser.runtime.onMessage.addListener(function(request, sender, sendResponse) {
     //get the data from the storageArea
 var storageData = {};
 browser.storage.local.get("myData", function (data) {
         //modify storageData here 
 });
  //send response ONLY when the data is finished loading(successfully or not)
  sendResponse(storageData);
});

Итак, мой вопрос: как я могу дождаться сбора данных и только затем продолжить?Может быть, мне не следует ждать события, и я должен создать какие-то «цепочки событий» или обратные вызовы?Я пока не уверен, как это организовать.Большое спасибо за помощь, ребята!

Ответы [ 2 ]

0 голосов
/ 27 января 2019

browser.storage.local.get() возвращает Promise, а chrome.storage.local.get() возвращает функцию обратного вызова.

Вы можете выбрать любой предпочитаемый вами способ.

Обещание затем ()

browser.runtime.onMessage.addListener((request, sender, sendResponse) => {

  //get the data from the storageArea
  browser.storage.local.get('myData')
  .then (storageData => {
    // do wathever with storageData
    sendResponse(storageData);
  })
  catch(error => console.log(error)); // in case of error
});

async / await

browser.runtime.onMessage.addListener(async (request, sender, sendResponse) => {

  //get the data from the storageArea
  let storageData = await browser.storage.local.get('myData');
  // do wathever with storageData
  sendResponse(storageData);
});

функция обратного вызова

browser.runtime.onMessage.addListener((request, sender, sendResponse) => {

  //get the data from the storageArea
  chrome.storage.local.get('myData', storageData => {
    // do wathever with storageData
    sendResponse(storageData);
  });
});
0 голосов
/ 27 января 2019

Вы можете ниже пример

browser.storage.local.get(function(storageData){
    // modify storage data 
    // ... 

    sendResponse(storageData);
});
...