Maison > interface Web > js tutoriel > Pourquoi « sendResponse » n'attend-il pas les fonctions asynchrones dans « chrome.runtime.onMessage » de Chrome ?

Pourquoi « sendResponse » n'attend-il pas les fonctions asynchrones dans « chrome.runtime.onMessage » de Chrome ?

Susan Sarandon
Libérer: 2024-11-23 06:49:21
original
974 Les gens l'ont consulté

Why Doesn't `sendResponse` Wait for Async Functions in Chrome's `chrome.runtime.onMessage`?

sendResponse n'attend pas la fonction asynchrone ou la résolution de la promesse

Ce problème survient lors de l'utilisation de chrome.runtime.onMessage avec une fonction asynchrone ou une promesse qui renvoie le résultat dans l'écouteur. Chrome ne prend actuellement pas en charge les promesses dans la valeur renvoyée de onMessage pour ManifestV3 et V2.

Racine du problème

L'écouteur onMessage s'attend à conserver une valeur vraie littérale le canal de messagerie ouvert pour la fonction sendResponse. Cependant, lorsque l'écouteur est déclaré asynchrone, il renvoie une promesse, qui est ignorée par l'implémentation onMessage, fermant effectivement le port et renvoyant undéfini à l'appelant.

Rendre l'écouteur compatible

Pour résoudre ce problème, on peut éliminer le mot-clé async de l'écouteur et créer une fonction asynchrone distincte qui est invoquée dans le écouteur :

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

Correction de l'API

Comme alternative, un correctif peut être appliqué à l'API, permettant des auditeurs asynchrones :

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

Avec ce patch, vous pouvez renvoyer une promesse ou une valeur directement depuis l'auditeur comme ceci :

chrome.runtime.onMessage.addListener(async msg => {
  if (msg === 'foo') {
    const res = await fetch('https://foo/bar');
    const payload = await res.text();
    return {payload};
  }
});
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal