未调用 Promise 解决方案,因为弹出窗口关闭得太快

Promise resolve not called because popup closes too fast

我有如下一段代码:

  browser.windows.create({ url: urls }).then((newWindow) => {
    newWindow.tabs.slice(0, pins.length).map((tab, index) => {
      browser.tabs.update(tab.id, { pinned: true })
    })
  })

当我阻止弹出窗口关闭时效果很好(通过 webdev 工具),但在常规用例中,不会触发解析。

当我开始开发我的插件时,我遇到了同样的问题(In My Pocket for Firefox, you can have a look at the code on bitbucket if it can help,我实现了我将要解释的内容)。我需要从弹出窗口触发对 API 的网络调用,并在请求成功时执行某些操作,但我遇到了完全相同的问题。

您必须牢记的是,只要弹出窗口打开,就会执行来自弹出窗口的代码。关闭弹出窗口就像关闭包含 Javascript 的网页:它的所有 JS 代码都是 "unloaded",代码执行停止,没有什么可以处理已解决的承诺。

一种避免这种情况的方法是在始终 运行 的后台脚本中实现实际行为,并通过消息在后台脚本和弹出窗口之间进行通信,通过 runtime.sendMessage method and an event listener setup with runtime.onMessage.addListener.

Background scripts are the place to put code that needs to maintain long-term state, or perform long-term operations, independently of the lifetime of any particular web pages or browser windows.

您可能会喜欢消息(共享对象而不是纯字符串),但您明白了。这样,即使在处理结束之前弹出窗口已关闭,您未立即解析的代码仍将一直得到处理,直到完成。