首頁 > web前端 > js教程 > 主體

為什麼 Chrome 的 onMessage 監聽器中的 sendResponse() 不等待非同步函數?

DDD
發布: 2024-11-22 16:29:14
原創
677 人瀏覽過

Why Doesn't `sendResponse()` Wait for Asynchronous Functions in Chrome's `onMessage` Listener?

"sendResponse" 不等待非同步函數或 Promise 的 Resolve

簡介

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';
}
登入後複製
修補API對於允許非同步/承諾偵聽器

或者,您可以透過使用chrome.runtime.onMessage 將以下程式碼新增至每個腳本來修補API 以允許非同步/承諾偵聽器:

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);
  });
}
登入後複製
With套用補丁後,可以直接傳回值:

以上是為什麼 Chrome 的 onMessage 監聽器中的 sendResponse() 不等待非同步函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板