我正在开发一个扩展程序,在其内容脚本和后台服务工作者(清单V3)之间进行了大量的消息传递。我注意到了新的基于Promise的V3 API中,尤其是sendResponse()函数出现了一些问题。
对于期望响应的API调用,一切正常。但是,如果我不需要响应并且不提供回调函数或使用promise的.then()方法(或async/await),则会抛出Promise错误——提示"在接收到响应之前,消息端口已关闭"。
奇怪的是,调用仍然有效,所以我想这个错误更像是一个警告。
代码示例:
在内容脚本中,向后台发送消息: ```html chrome.runtime.sendMessage({ greeting: "hello" }); ``` 在后台中,接收消息并发送回复: ```html chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.greeting === "hello") { // do something sendResponse({ farewell: "goodbye" }); } }); ```
背景脚本接收消息并执行某些操作,然后不发送响应而退出:
对于期望响应的API调用,一切正常。但是,如果我不需要响应并且不提供回调函数或使用promise的.then()方法(或async/await),则会抛出Promise错误——提示"在接收到响应之前,消息端口已关闭"。
奇怪的是,调用仍然有效,所以我想这个错误更像是一个警告。
代码示例:
在内容脚本中,向后台发送消息: ```html chrome.runtime.sendMessage({ greeting: "hello" }); ``` 在后台中,接收消息并发送回复: ```html chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request.greeting === "hello") { // do something sendResponse({ farewell: "goodbye" }); } }); ```
chrome.runtime.sendMessage({ type: 'toggle_setting' })
背景脚本接收消息并执行某些操作,然后不发送响应而退出:
chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => {
if (message.type === 'toggle-setting') {
//* do whatever it does
}
})
上述错误是由背景代码引起的。但如果我在其中添加一行代码,并以无参数的方式调用sendResponse()函数,则不会发生错误。
chrome.runtime.onMessage.addListener( (message, sender, sendResponse) => {
sendResponse()
if (message.type === 'toggle-setting') {
//* do whatever it does
}
})
因此,这样可以消除错误信息,但是当没有响应需要或预期时,我并不清楚为什么这是必要的。是否有其他方法向基于 Promise 的 V3 API 发出信号,或者即使不需要,现在也需要调用 sendResponse()?
onMessageExternal
吗? - Alex Rothberg