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

為什麼 Chrome 擴充功能的 onMessage 監聽器中的 `sendResponse` 不等待我的非同步函數?

Patricia Arquette
發布: 2024-11-26 04:02:08
原創
452 人瀏覽過

Why Doesn't `sendResponse` Wait for My Async Function in a Chrome Extension's `onMessage` Listener?

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

問題:

問題:

問題:


問題:

    分析:
  1. Chrome 在 ManifestV3 和 ManifestV3 都不支援 onMessage 監聽器的回傳值中包含 Promises V2。這表示非同步偵聽器傳回的 sendResponse Promise 被忽略,並且連接埠立即關閉。
解決方案:
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);
  // .................
  return 'foo';
}
登入後複製

要將偵聽器相容:

  1. 從onMessage 關鍵字事件中刪除async 關鍵字監聽器。
建立一個單獨的非同步函數並從事件監聽器呼叫它。例如:
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);
  });
}
登入後複製
要修補 API 以允許非同步/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.runtime.onMessage:然後您>然後您可以簡單地從非同步偵聽器傳回值:

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

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