首頁  >  文章  >  web前端  >  如何讓「sendResponse」等待 Chrome 擴充功能中的非同步函數?

如何讓「sendResponse」等待 Chrome 擴充功能中的非同步函數?

DDD
DDD原創
2024-11-23 20:21:09161瀏覽

How Can I Make `sendResponse` Wait for Async Functions in Chrome Extensions?

sendResponse 等待非同步函數和Promise 解析

問題: 在Chrome 腳本中,內容腳本中的內容腳本() .js 不會暫停getThumbnails()

說明: Chrome 的 chrome.runtime.onMessage 事件監聽器傳回一個布林值,以指示通道是否應為 sendResponse 保持開啟狀態。當傳回非同步函數或 Promise 時,Chrome 會忽略 Promise 並立即關閉頻道。

解決方案:使事件監聽器與非同步函數相容:

  1. 刪除async 關鍵字:從事件監聽器的開頭刪除async關鍵字function.
  2. 定義一個單獨的非同步函數:建立一個單獨的非同步函數來處理訊息處理。從事件偵聽器呼叫此函數。

範例:

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) {
  console.log('Processing message', msg);
  // ... Handle the message processing here ...
  return 'foo';
}

替代解決方案:修補 API

將以下程式碼新增至每個使用的腳本的開頭chrome.runtime.onMessage:

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);
  });
}

此修補程式允許事件監聽器傳回非同步函數或 Promise。

以上是如何讓「sendResponse」等待 Chrome 擴充功能中的非同步函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn