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
244 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!

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