Heim > Web-Frontend > js-Tutorial > Wie kann ich „sendResponse' in Chrome-Erweiterungen auf asynchrone Funktionen warten lassen?

Wie kann ich „sendResponse' in Chrome-Erweiterungen auf asynchrone Funktionen warten lassen?

DDD
Freigeben: 2024-11-23 20:21:09
Original
190 Leute haben es durchsucht

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

sendResponse wartet auf asynchrone Funktionen und Promise-Lösungen

Problem: In einer Chrome-Erweiterung sendResponse() in Contentscript .js pausiert nicht für getThumbnails() fertig.

Erklärung: Der chrome.runtime.onMessage-Ereignis-Listener von Chrome gibt einen booleschen Wert zurück, um anzugeben, ob der Kanal für sendResponse offen gehalten werden soll. Wenn eine asynchrone Funktion oder ein Versprechen zurückgegeben wird, ignoriert Chrome das Versprechen und schließt den Kanal sofort.

Lösung: Machen Sie den Ereignis-Listener mit asynchronen Funktionen kompatibel:

  1. Entfernen Sie das Schlüsselwort async: Entfernen Sie das Schlüsselwort async vom Anfang des Ereignis-Listeners Funktion.
  2. Definieren Sie eine separate asynchrone Funktion: Erstellen Sie eine separate asynchrone Funktion, die die Nachrichtenverarbeitung übernimmt. Rufen Sie diese Funktion aus dem Ereignis-Listener heraus auf.

Beispiel:

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

Alternative Lösung: Patchen Sie die API

Fügen Sie den folgenden Code am Anfang jedes Skripts hinzu, das verwendet wird 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);
  });
}
Nach dem Login kopieren

Dieser Patch ermöglicht es dem Ereignis-Listener, eine asynchrone Funktion oder ein Versprechen zurückzugeben.

Das obige ist der detaillierte Inhalt vonWie kann ich „sendResponse' in Chrome-Erweiterungen auf asynchrone Funktionen warten lassen?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage