未调用 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.
您可能会喜欢消息(共享对象而不是纯字符串),但您明白了。这样,即使在处理结束之前弹出窗口已关闭,您未立即解析的代码仍将一直得到处理,直到完成。
我有如下一段代码:
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.
您可能会喜欢消息(共享对象而不是纯字符串),但您明白了。这样,即使在处理结束之前弹出窗口已关闭,您未立即解析的代码仍将一直得到处理,直到完成。