【问题标题】:Chrome Extension multiple async calls [duplicate]Chrome扩展多个异步调用[重复]
【发布时间】:2020-10-21 00:56:44
【问题描述】:

我正在开发 Chrome 扩展程序。我对回调有点困惑。在某些情况下,我需要进行多个异步调用。 例如,我有

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {

}

在其中我需要调用 chrome.storage.local.remove 和 chrome.storage.local.set。对消息的响应将基于远程和设置的结果。如果它们失败了,当然会发送不同的响应。

应该如何处理?

【问题讨论】:

  • 除了上面经典的多异步回调主题之外,您还需要从 onMessage 侦听器到 return true,这将使您能够稍后调用 sendResponse。

标签: javascript google-chrome-extension


【解决方案1】:

我建议您使用标准 js 工具(webpack/babel)构建您的 chrome 扩展。使用这样的现代语法可以很容易地处理多个回调:

const setStore = (data) => {
    return new Promise((resolve) => chrome.storage.local.set(data, resolve));
};

const async handleAsyncMessage = (request, sender, sendResponse) => {
    await doSomething();
    await setStore({ myKey: 1 });

    //or if you dont want them to run sequentially

    await Promise.all([
      doSomething(),
      doAnotherThing(),
    ]);
};

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  handleAsyncMessage(request, sender, sendResponse);

  return true;
});

您可以将 chrome.storage.local.remove 和 chrome.storage.local.set 包装在一个函数中,该函数返回一个在执行其回调时解析的承诺。这将使您的代码比回调地狱更易于阅读。

【讨论】:

  • 这将无法发送响应,因为侦听器需要返回文字 true 以保持通道打开,但您的侦听器返回一个 Promise。 Chrome 扩展 API 不理解 Promise。解决方案是使用单独的 async 函数或显式使用 Promise 或加载 Mozilla 的 browser 命名空间 polyfill,这使我们能够像您一样直接使用 async 侦听器。
  • @wOxxOm 你基本上是正确的,感谢您的更正:OP 需要将它包装在一个常规函数中,但如果处理程序是异步的,回调应该只返回文字 true。我们的代码有一个很大的 switch 语句,对于可以同步处理的消息,我们不返回 true。
  • 好吧,OP 明确表示他们将在内部使用异步的东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2021-07-27
  • 2015-05-22
  • 1970-01-01
相关资源
最近更新 更多