Rumah > hujung hadapan web > tutorial js > Mengapa Tidak `sendResponse` Menunggu Fungsi Async dalam `chrome.runtime.onMessage` Chrome?

Mengapa Tidak `sendResponse` Menunggu Fungsi Async dalam `chrome.runtime.onMessage` Chrome?

Susan Sarandon
Lepaskan: 2024-11-23 06:49:21
asal
973 orang telah melayarinya

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

sendResponse Tidak Menunggu Fungsi Async atau Promise's Resolve

Isu ini timbul apabila menggunakan chrome.runtime.onMessage dengan fungsi async atau Promise yang mengembalikan hasil dalam pendengar. Chrome pada masa ini tidak menyokong Promises dalam nilai yang dikembalikan onMessage untuk kedua-dua ManifestV3 dan V2.

Akar Masalah

Pendengar onMessage mengharapkan nilai sebenar literal untuk disimpan saluran pemesejan dibuka untuk fungsi sendResponse. Walau bagaimanapun, apabila pendengar diisytiharkan sebagai tidak segerak, ia mengembalikan Janji, yang diabaikan oleh pelaksanaan onMessage, dengan berkesan menutup port dan kembali tidak ditentukan kepada pemanggil.

Menjadikan Pendengar Serasi

Untuk menyelesaikan isu ini, seseorang boleh menghapuskan kata kunci async daripada pendengar dan mencipta fungsi async berasingan yang digunakan dalam pendengar:

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
}
Salin selepas log masuk

Menampal API

Sebagai alternatif, tampung boleh digunakan pada API, membenarkan pendengar tak segerak:

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);
  });
}
Salin selepas log masuk

Dengan tampung ini, anda boleh mengembalikan Janji atau nilai terus daripada pendengar seperti jadi:

chrome.runtime.onMessage.addListener(async msg => {
  if (msg === 'foo') {
    const res = await fetch('https://foo/bar');
    const payload = await res.text();
    return {payload};
  }
});
Salin selepas log masuk

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan