sendResponse 不等待异步函数或 Promise 的解析
将 chrome.runtime.onMessage 与异步函数或 Promise 一起使用时会出现此问题将结果返回到侦听器中。 Chrome 目前不支持 ManifestV3 和 V2 的 onMessage 返回值中的 Promises。
问题根源
onMessage 侦听器期望保留文字 true 值为 sendResponse 函数打开的消息通道。但是,当侦听器被声明为异步时,它会返回一个 Promise,该 Promise 会被 onMessage 实现忽略,从而有效地关闭端口并向调用者返回 undefined。
使侦听器兼容
要解决此问题,可以从侦听器中消除 async 关键字,并创建一个在侦听器中调用的单独的异步函数。监听器:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.message === "get_thumbnails") { processMessage(msg).then(sendResponse); return true; // keep the channel open for sendResponse } }); async function processMessage(msg) { // Process the message and return the result }
修补 API
作为替代方案,可以将补丁应用于 API,以允许异步监听器:
if ('crbug.com/1185241') { // Check for Chrome version const {onMessage} = chrome.runtime, {addListener} = onMessage; onMessage.addListener = fn => addListener.call(onMessage, (msg, sender, respond) => { const res = fn(msg, sender, respond); if (res instanceof Promise) return !!res.then(respond, console.error); if (res !== undefined) respond(res); }); }
使用此补丁,您可以直接从侦听器返回 Promise 或值,例如所以:
chrome.runtime.onMessage.addListener(async msg => { if (msg === 'foo') { const res = await fetch('https://foo/bar'); const payload = await res.text(); return {payload}; } });
以上是为什么 Chrome 的 chrome.runtime.onMessage 中的 sendResponse 不等待异步函数?的详细内容。更多信息请关注PHP中文网其他相关文章!