Rumah > hujung hadapan web > tutorial js > Bagaimanakah Saya Boleh Membuat `sendResponse` Tunggu Fungsi Async dalam Sambungan Chrome?

Bagaimanakah Saya Boleh Membuat `sendResponse` Tunggu Fungsi Async dalam Sambungan Chrome?

DDD
Lepaskan: 2024-11-23 20:21:09
asal
275 orang telah melayarinya

How Can I Make `sendResponse` Wait for Async Functions in Chrome Extensions?

sendResponse Menunggu Fungsi Async dan Promise Menyelesaikan

Masalah: Dalam sambungan Chrome, sendResponse() dalam skrip kandungan .js tidak berhenti seketika untuk getThumbnails() ke selesai.

Penjelasan: Pendengar acara chrome.runtime.onMessage Chrome mengembalikan nilai boolean untuk menunjukkan sama ada saluran harus dibuka untuk sendResponse. Apabila fungsi async atau Promise dikembalikan, Chrome mengabaikan Promise dan menutup saluran serta-merta.

Penyelesaian: Jadikan pendengar acara serasi dengan fungsi async:

  1. Alih keluar kata kunci async: Alih keluar kata kunci async dari permulaan pendengar acara fungsi.
  2. Tentukan fungsi tak segerak yang berasingan: Buat fungsi tak segerak berasingan yang mengendalikan pemprosesan mesej. Panggil fungsi ini dari dalam pendengar acara.

Contoh:

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) {
  console.log('Processing message', msg);
  // ... Handle the message processing here ...
  return 'foo';
}
Salin selepas log masuk

Penyelesaian Alternatif: Tampal API

Tambahkan kod berikut pada permulaan setiap skrip yang digunakan 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);
  });
}
Salin selepas log masuk

Tampung ini membenarkan pendengar acara mengembalikan fungsi async atau Promise.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membuat `sendResponse` Tunggu Fungsi Async dalam Sambungan Chrome?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan