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
Mary-Kate OlsenOriginal
2024-11-29 03:52:08246Durchsuche

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
}

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

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!

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