Heim > Web-Frontend > js-Tutorial > Hauptteil

Warum wartet „sendResponse' in „chrome.runtime.onMessage' von Chrome nicht auf asynchrone Funktionen?

Susan Sarandon
Freigeben: 2024-11-23 06:49:21
Original
910 Leute haben es durchsucht

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

sendResponse wartet nicht auf die asynchrone Funktion oder die Lösung des Versprechens

Dieses Problem tritt auf, wenn chrome.runtime.onMessage mit einer asynchronen Funktion oder einem Versprechen verwendet wird das gibt das Ergebnis im Listener zurück. Chrome unterstützt derzeit keine Promises im zurückgegebenen Wert von onMessage für ManifestV3 und V2.

Ursache des Problems

Der onMessage-Listener erwartet, dass ein buchstäblich wahrer Wert beibehalten wird Der für die sendResponse-Funktion geöffnete Nachrichtenkanal. Wenn der Listener jedoch als asynchron deklariert wird, gibt er ein Promise zurück, das von der onMessage-Implementierung ignoriert wird, wodurch der Port effektiv geschlossen wird und undefiniert an den Aufrufer zurückgegeben wird.

Kompatibilität des Listeners herstellen

Um dieses Problem zu beheben, kann man das Schlüsselwort async aus dem Listener entfernen und eine separate async-Funktion erstellen, die innerhalb des Listeners aufgerufen wird Listener:

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
}
Nach dem Login kopieren

Patching der API

Alternativ kann ein Patch auf die API angewendet werden, der asynchrone Listener ermöglicht:

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);
  });
}
Nach dem Login kopieren

Mit diesem Patch können Sie ein Versprechen oder einen Wert direkt vom Listener zurückgeben, etwa so:

chrome.runtime.onMessage.addListener(async msg => {
  if (msg === 'foo') {
    const res = await fetch('https://foo/bar');
    const payload = await res.text();
    return {payload};
  }
});
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum wartet „sendResponse' in „chrome.runtime.onMessage' von Chrome nicht auf asynchrone Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage