Heim >Web-Frontend >js-Tutorial >Wie kann ich „sendResponse' in Chrome-Erweiterungen auf asynchrone Funktionen warten lassen?
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:
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!