首頁 >web前端 >js教程 >為什麼 Chrome 的 chrome.runtime.onMessage 中的 sendResponse 不等待非同步函式?

為什麼 Chrome 的 chrome.runtime.onMessage 中的 sendResponse 不等待非同步函式?

Susan Sarandon
Susan Sarandon原創
2024-11-23 06:49:21975瀏覽

Why Doesn't `sendResponse` Wait for Async Functions in Chrome's `chrome.runtime.onMessage`?

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中文網其他相關文章!

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