Rumah >hujung hadapan web >tutorial js >Mengapa `SendResponse` Tidak Menunggu Fungsi Async Saya dalam Pendengar `onMessage` Sambungan Chrome?

Mengapa `SendResponse` Tidak Menunggu Fungsi Async Saya dalam Pendengar `onMessage` Sambungan Chrome?

Patricia Arquette
Patricia Arquetteasal
2024-11-26 04:02:08557semak imbas

Why Doesn't `sendResponse` Wait for My Async Function in a Chrome Extension's `onMessage` Listener?

sendResponse Tidak Menunggu Fungsi Async atau Penyelesaian Janji

Masalah:
Isu ketaksinkronan di mana sendResponse() dalam contentscript.js tidak berhenti seketika sehingga getThumbnails() kembali. Selain itu, muatan dalam getThumbnails() selalunya batal, menunjukkan kemungkinan pelaksanaan tidak lengkap.

Analisis:
Chrome tidak menyokong Promises dalam nilai yang dikembalikan pendengar onMessage dalam kedua-dua ManifestV3 dan V2. Ini bermakna SendResponse Promise yang dikembalikan oleh pendengar async diabaikan dan port ditutup serta-merta.

Penyelesaian:
Untuk menjadikan pendengar serasi:

  1. Alih keluar kata kunci async daripada acara onMessage pendengar.
  2. Buat fungsi async yang berasingan dan panggilnya daripada pendengar acara. Contohnya:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.message === "get_thumbnails") {
    processMessage(msg).then(sendResponse);
    return true; // keep the messaging channel open for sendResponse
  }
});

async function processMessage(msg) {
  console.log('Processing message', msg);
  // .................
  return 'foo';
}

Untuk menampal API untuk membenarkan pendengar async/Promise:

  1. Tambah kod berikut pada bahagian atas setiap skrip yang menggunakan 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);
  });
}
  1. Anda boleh kemudian hanya kembalikan nilai daripada pendengar async:
chrome.runtime.onMessage.addListener(async msg => {
  if (msg === 'foo') {
    const res = await fetch('https://foo/bar');
    const payload = await res.text();
    return {payload};
  }
});

Atas ialah kandungan terperinci Mengapa `SendResponse` Tidak Menunggu Fungsi Async Saya dalam Pendengar `onMessage` Sambungan Chrome?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn