Как дождаться завершения асинхронного chrome.storage.local.get (), прежде чем продолжить выполнение - PullRequest
0 голосов
/ 22 декабря 2019

У меня два звонка на chrome.storage.local.get(). Мне нужно, чтобы эти вызовы завершились, прежде чем продолжить выполнение остальной части кода (вызов функции continueCode()) для моего расширения Chrome, но я не уверен, как это сделать, вот мой код.

function getData() {
    chrome.storage.local.get(['key'], function(result) {
        if (Object.values(result)[0] != undefined) {
            object1.innerHTML = Object.values(result)[0].val;
        }
    });

    chrome.storage.local.get(['key2'], function(result) {
         if (Object.values(result)[0] != undefined) {
             object2.innerHTML = Object.values(result)[0].val;
         }
    });

    continueCode();
}

Ответы [ 2 ]

1 голос
/ 22 декабря 2019

Вам нужно дождаться выполнения обеих функций обратного вызова, которые вы передаете chrome.storage.local.get(..), прежде чем вызывать continueCode(), также вы можете проверить оба свойства хранилища одним вызовом, вот пример:

function getData() {
  chrome.storage.local.get(['key', 'key2'], function(result) {
    if (typeof result.key !== 'undefined') {
      object1.innerHTML = result.key.val;
    } 
    if (typeof result.key2 !== 'undefined') {
      object2.innerHTML = result.key2.val;
    } 
    continueCode();
  }
}
0 голосов
/ 22 декабря 2019

Вы можете использовать Promise, async/await, чтобы справиться с этим. Допустим, вы хотите обрабатывать chrome.storage.local.get синхронно, чтобы continueCode() мог иметь необходимые данные.

Получить данные:

function readLocalStorage(key) {
    return Promise((resolve, reject) => {
        chrome.storage.local.get([key], function(result) {
            if (Object.values(result)[0] != undefined) {
                resolve(Object.values(result)[0].val);
            } else {
                reject();
            }
        });
    });
}

Основная функция:


function async getData() {
    let key1 = await readLocalStorage('key1');
    object1.innerHTML = key1;
    let key2 = await readLocalStorage('key1');
    object1.innerHTML = key2;

    continueCode();
}

или, если вы не знакомы с поведением async/await. Вы можете заключить эти два обещания в массив и использовать Promise.all, например, так:

function async getData() {
    let key1 = readLocalStorage('key1');
    let key2 = readLocalStorage('key2');

    Promise.all([key1, key2]).then(values => {
        object1.innerHTML = values[0];
        object2.innerHTML = values[1];

        continueCode();
    });
}

Надеюсь, это поможет!

...