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
Libérer: 2024-11-23 20:21:09
original
240 Les gens l'ont consulté

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';
}
Copier après la connexion

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);
  });
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal