Heim > Web-Frontend > js-Tutorial > Warum wartet „sendResponse()' im „onMessage'-Listener von Chrome nicht auf asynchrone Funktionen?

Warum wartet „sendResponse()' im „onMessage'-Listener von Chrome nicht auf asynchrone Funktionen?

DDD
Freigeben: 2024-11-22 16:29:14
Original
737 Leute haben es durchsucht

Why Doesn't `sendResponse()` Wait for Asynchronous Functions in Chrome's `onMessage` Listener?

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

Einführung

Beim Senden einer Nachricht von popup.js zu contentscript.js, der Funktion sendResponse() Es wird erwartet, dass auf den Abschluss der Funktion getThumbnails() gewartet wird. In diesem Szenario wartet sendResponse() jedoch nicht, was zu Problemen mit der Asynchronität führt.

Erläuterung des Problems

Das Hauptproblem besteht darin, dass Chrome immer noch keine Unterstützung für Versprechen im zurückgegebenen Wert von onMessage-Listenern bietet sowohl in Manifest V2 als auch V3. Wenn Ihr Listener das Schlüsselwort async deklariert, gibt er daher ein Promise anstelle des für onMessage erforderlichen wörtlichen wahren Werts zurück. Dies führt dazu, dass das zurückgegebene Versprechen ignoriert wird und der Nachrichtenkanal vorzeitig geschlossen wird.

Lösung: Den Listener kompatibel machen

Um die Kompatibilität mit der aktuellen Chrome-Implementierung sicherzustellen, können Sie das Schlüsselwort async von zuvor entfernen die Funktionsparameter (request, sender, sendResponse) und deklarieren Sie eine separate asynchrone Funktion zur Abwicklung der Nachrichtenverarbeitung:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.message === "get_thumbnails") {
    processMessage(msg).then(sendResponse);
    return true; // keep the messaging channel open for sendResponse
  }
});

async function processMessage(msg) {
  console.log('Processing message', msg);
  // ... asynchronous processing code
  return 'foo';
}
Nach dem Login kopieren

Patching der API für Allow Asynchroner/Promise-Listener

Alternativ können Sie die API patchen, um asynchrone/Promise-Listener zuzulassen, indem Sie jedem Skript mit chrome.runtime.onMessage den folgenden Code hinzufügen:

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

Mit dem Patch angewendet, können Sie den Wert direkt zurückgeben:

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()' im „onMessage'-Listener 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage