Maison >interface Web >js tutoriel >Comment puis-je faire en sorte que « sendResponse » attende les fonctions asynchrones dans les extensions Chrome ?

Comment puis-je faire en sorte que « sendResponse » attende les fonctions asynchrones dans les extensions Chrome ?

DDD
DDDoriginal
2024-11-23 20:21:09238parcourir

How Can I Make `sendResponse` Wait for Async Functions in Chrome Extensions?

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 :

  1. Supprimer le mot-clé async : Supprimez le mot-clé async du début de l'écouteur d'événement function.
  2. Définir une fonction asynchrone distincte : Créez une fonction asynchrone distincte qui gère le traitement des messages. Appelez cette fonction depuis l'écouteur d'événement.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Var Vs Let Vs ConstArticle suivant:Var Vs Let Vs Const