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
DDDOriginal
2024-11-23 20:21:09235Durchsuche

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

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

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!

Stellungnahme:
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
Vorheriger Artikel:Var vs. Let vs. ConstNächster Artikel:Var vs. Let vs. Const