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
Susan Sarandonoriginal
2024-11-23 06:49:21975parcourir

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
}

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);
  });
}

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};
  }
});

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