JS Promise在工作chrome.storage.sync时不链接

时间:2019-05-27 06:58:37

标签: javascript asynchronous promise chaining

我正在尝试进行Promise链接,但是以某种方式使用chrome.storage.sync.get进行异步调用总是会在以后返回。我认为这应该是正确的顺序:

  1. 创建一个元素并附加到正文
  2. 致电chrome.storage.sync
  3. 基于2)结果,在1)中创建的元素上触发一些事件

我已经尝试在2)步骤中添加新的Promise,但没有成功。 console.log总是以错误的顺序返回。像这样:

  1. // insertChecbox完成
  2. //开始承诺chrome.storage.sync
  3. //未定义
  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 :(得分:0)

由于注意到了这个问题,我找到了一个解决方案,方法是更改​​第一个.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(...);