JS Promise не работает при работе chrome.storage.sync - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь создать цепочку обещаний, но каким-то образом асинхронный вызов с использованием chrome.storage.sync.get всегда возвращается позже. Вот правильный порядок, я думал, что это должно быть:

  1. Создать элемент и добавить к телу
  2. Звоните chrome.storage.sync
  3. На основе 2) результата, вызвать какое-либо событие для элемента, созданного в 1)

Я уже пытался поместить новое Обещание в 2) шаг, но безуспешно. console.log всегда возвращается в неправильном порядке. Что-то вроде:

  1. // insertChecbox done
  2. // начать обещание chrome.storage.sync
  3. // undefined
  4. // результат asnyc: ...

Вот моя попытка:

const pr = new Promise(resolve => {
  this.createCheckbox();
  console.log('insertChecbox done')
  resolve();
});

pr
  .then( resolve => {
    console.log("start promise chrome.storage.sync");

    return new Promise( resolve => {
      return resolve(chrome.storage.sync.get(["code", "isAutocheck"], result => {
        console.log('result async: ', result );
        return result
      }));
    });
  })
  .then( result => {
    console.log(result);
    console.log('This always run before the `chrome.storage.sync` finishes loading`)
    if (result.isAutocheck) {
      const domCheckbox = this.getCheckboxElement();
      domCheckbox && domCheckbox.click();
    }
  });

Я хотел отделить результат chrome.storage.sync, потому что мне нужно работать над другими вещами, не делая этот обратный вызов слишком сложным

1 Ответ

0 голосов
/ 27 мая 2019

Спасибо, что обратили внимание на этот вопрос, я нашел решение, изменив немного в своем первом .then, явно разрешив результат chrome.storage.sync.get, а не все.

pr
  .then( () => {
    return new Promise( resolve => {
      return chrome.storage.sync.get(["code", "isAutocheck"], result => {
        console.log('result async: ', result );
        return resolve(result)
      });
    });
  })
  .then(...);
...