Heim > Web-Frontend > js-Tutorial > Wie kann das Problem behoben werden, dass „sendResponse nicht auf die asynchrone Funktion oder die Auflösung von Promise wartet' in „chrome.tabs.sendMessage' von Chrome?

Wie kann das Problem behoben werden, dass „sendResponse nicht auf die asynchrone Funktion oder die Auflösung von Promise wartet' in „chrome.tabs.sendMessage' von Chrome?

Mary-Kate Olsen
Freigeben: 2024-11-29 03:52:08
Original
294 Leute haben es durchsucht

How to Resolve

Fehlerbehebung „sendResponse wartet nicht auf asynchrone Funktion oder Promise-Auflösung“

Problem:
Chrome's Chrome. Die sendResponse-Funktion von tabs.sendMessage wartet nicht auf asynchrone Funktionen oder versprochene Lösungen.

Problemanalyse:

Im bereitgestellten Code ist die getThumbnails-Funktion im Inhaltsskript (contentscript.js) eine asynchrone Funktion, deren Ausführung einige Zeit in Anspruch nimmt ausführen. Die sendResponse-Funktion im onMessage-Listener wird jedoch sofort aufgerufen, möglicherweise bevor getThumbnails ihre Ausführung abgeschlossen hat. Dies führt dazu, dass sendResponse als Antwort undefiniert oder null zurückgibt.

Lösung 1: Asynchrones Schlüsselwort entfernen und separate asynchrone Funktion deklarieren

  • Entfernen Sie das asynchrone Schlüsselwort aus der onMessage Listener-Funktion.
  • Erstellen Sie eine separate asynchrone Funktion, um die Nachricht zu verarbeiten Verarbeitung.
  • Rufen Sie die separate asynchrone Funktion vom onMessage-Listener auf und verarbeiten Sie die Antwort entsprechend.

Lösung 2: Patchen der API für den asynchronen Listener

  • Fügen Sie einen Patch hinzu, bevor Sie chrome.runtime.onMessage in allen Skripten verwenden, die es verwenden it.
  • Der Patch definiert die addListener-Methode neu, um Promise- oder asynchrone Funktionsantworten innerhalb des Listeners zu ermöglichen.

Implementierung in Contentscript.js:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.message === "get_thumbnails") {
    getThumbnails().then(payload => {
      sendResponse({ payload });
      return true;  // Keep messaging channel open for sendResponse
    });
  }
});

async function getThumbnails() {
  // Your code to retrieve thumbnails
}
Nach dem Login kopieren

Umsetzung mit Patch:

// Patch to allow async/Promise listener
if ('crbug.com/1185241') {  // Replace with Chrome version check
  const { onMessage } = chrome.runtime;
  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);
  });
}

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 vonWie kann das Problem behoben werden, dass „sendResponse nicht auf die asynchrone Funktion oder die Auflösung von Promise wartet' in „chrome.tabs.sendMessage' von Chrome?. 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