由于弹出窗口关闭太快,因此未调用Promise resolve

时间:2018-06-10 09:44:56

标签: firefox-addon firefox-addon-sdk

我有以下代码:

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

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

1 个答案:

答案 0 :(得分:1)

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

您要记住的是,只要打开弹出窗口,就会执行弹出窗口中的代码。关闭弹出窗口就像关闭一个包含Javascript的网页:其所有JS代码均已“卸载”,代码执行停止,没有更多内容可处理已解决的Promise。

一种避免这种情况的方法是在始终始终运行的后台脚本中实现实际行为,并通过runtime.sendMessage方法和事件通过消息在后台脚本和弹出窗口之间进行通信runtime.onMessage.addListener设置监听器。

  

背景脚本是放置需要保持长期状态或执行长期操作的代码的地方,而与任何特定网页或浏览器窗口的生命周期无关。

popup and background scrpit message flow illustration

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