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
Susan Sarandonasal
2024-11-23 06:49:21998semak imbas

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
}

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

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

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!

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