sendResponse wartet nicht auf die asynchrone Funktion oder die Lösung des Versprechens
Dieses Problem tritt auf, wenn chrome.runtime.onMessage mit einer asynchronen Funktion oder einem Versprechen verwendet wird das gibt das Ergebnis im Listener zurück. Chrome unterstützt derzeit keine Promises im zurückgegebenen Wert von onMessage für ManifestV3 und V2.
Ursache des Problems
Der onMessage-Listener erwartet, dass ein buchstäblich wahrer Wert beibehalten wird Der für die sendResponse-Funktion geöffnete Nachrichtenkanal. Wenn der Listener jedoch als asynchron deklariert wird, gibt er ein Promise zurück, das von der onMessage-Implementierung ignoriert wird, wodurch der Port effektiv geschlossen wird und undefiniert an den Aufrufer zurückgegeben wird.
Kompatibilität des Listeners herstellen
Um dieses Problem zu beheben, kann man das Schlüsselwort async aus dem Listener entfernen und eine separate async-Funktion erstellen, die innerhalb des Listeners aufgerufen wird Listener:
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) { // Process the message and return the result }
Patching der API
Alternativ kann ein Patch auf die API angewendet werden, der asynchrone Listener ermöglicht:
if ('crbug.com/1185241') { // Check for Chrome version 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); }); }
Mit diesem Patch können Sie ein Versprechen oder einen Wert direkt vom Listener zurückgeben, etwa so:
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 vonWarum wartet „sendResponse' in „chrome.runtime.onMessage' von Chrome nicht auf asynchrone Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!