從 popup.jscontentscript.js,sendResponse() 函式預計會等待 getThumbnails() 函式完成。然而,在這種情況下,sendResponse() 沒有等待,導致非同步問題。
問題說明主要問題是 Chrome 仍然缺乏對 onMessage 監聽器返回值中的 Promise 的支援在清單 V2 和 V3 中。因此,當您的偵聽器聲明 async 關鍵字時,它會傳回一個 Promise,而不是 onMessage 所需的字面 true 值。這會導致返回的 Promise 被忽略,過早關閉訊息通道。 解決方案:使監聽器相容為了確保與目前Chrome 實現的兼容性,您可以刪除先前的async 關鍵字函數參數(request、sender、sendResponse)並聲明一個單獨的非同步函數來處理訊息處理:chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.message === "get_thumbnails") { processMessage(msg).then(sendResponse); return true; // keep the messaging channel open for sendResponse } }); async function processMessage(msg) { console.log('Processing message', msg); // ... asynchronous processing code return 'foo'; }
if ('crbug.com/1185241') { // replace with a check for Chrome version that fixes the bug 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); }); }
以上是為什麼 Chrome 的 onMessage 監聽器中的 sendResponse() 不等待非同步函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!