Maison >interface Web >js tutoriel >Comment puis-je faire en sorte que « sendResponse » attende les fonctions asynchrones dans les extensions Chrome ?
sendResponse attend les fonctions asynchrones et la promesse est résolue
Problème : Dans une extension Chrome, sendResponse() dans contentscript .js ne s'arrête pas pour que getThumbnails() finish.
Explication : L'écouteur d'événement chrome.runtime.onMessage de Chrome renvoie une valeur booléenne pour indiquer si le canal doit rester ouvert pour sendResponse. Lorsqu'une fonction asynchrone ou une promesse est renvoyée, Chrome ignore la promesse et ferme immédiatement la chaîne.
Solution : Rendre l'écouteur d'événement compatible avec les fonctions asynchrones :
Exemple :
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'; }
Solution alternative : corrigez l'API
Ajoutez le code suivant au début de chaque script qui utilise 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); }); }
Ce correctif permet à l'écouteur d'événements de renvoyer une fonction asynchrone ou une promesse.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!