Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Menyelesaikan \'sendResponse tidak menunggu fungsi async atau Promise\'s resolve\' dalam `chrome.tabs.sendMessage` Chrome?

Bagaimana untuk Menyelesaikan \'sendResponse tidak menunggu fungsi async atau Promise\'s resolve\' dalam `chrome.tabs.sendMessage` Chrome?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-29 03:52:08246semak imbas

How to Resolve

Menyelesaikan masalah "sendResponse tidak menunggu fungsi async atau janji Janji"

Isu:
Chrome Chrome. Fungsi sendResponse tabs.sendMessage tidak menunggu asynchronous fungsi atau resolusi Janji.

Analisis Masalah:

Dalam kod yang disediakan, fungsi getThumbnails dalam skrip kandungan (contentscript.js) ialah fungsi tak segerak yang memerlukan masa untuk melaksanakan. Walau bagaimanapun, fungsi sendResponse dalam pendengar onMessage digunakan serta-merta, berkemungkinan sebelum getThumbnails menyelesaikan pelaksanaannya. Ini membawa kepada sendResponse mengembalikan tidak ditentukan atau batal sebagai balasan.

Penyelesaian 1: Alih Keluar Kata Kunci Async dan Isytiharkan Fungsi Async Berasingan

  • Alih keluar kata kunci async daripada onMessage fungsi pendengar.
  • Buat fungsi tak segerak yang berasingan untuk dikendalikan pemprosesan mesej.
  • Gunakan fungsi async yang berasingan daripada pendengar onMessage dan kendalikan respons dengan sewajarnya.

Penyelesaian 2: Menampal API untuk Pendengar Async

  • Tambahkan tampalan sebelum menggunakan chrome.runtime.onMessage dalam semua skrip yang menggunakan ia.
  • Tampalan mentakrifkan semula kaedah addListener untuk mendayakan Janji atau respons fungsi tak segerak dalam pendengar.

Pelaksanaan dalam Contentscript.js:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.message === "get_thumbnails") {
    getThumbnails().then(payload => {
      sendResponse({ payload });
      return true;  // Keep messaging channel open for sendResponse
    });
  }
});

async function getThumbnails() {
  // Your code to retrieve thumbnails
}

Pelaksanaan dengan Tampalan:

// Patch to allow async/Promise listener
if ('crbug.com/1185241') {  // Replace with Chrome version check
  const { onMessage } = chrome.runtime;
  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);
  });
}

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 Bagaimana untuk Menyelesaikan \'sendResponse tidak menunggu fungsi async atau Promise\'s resolve\' dalam `chrome.tabs.sendMessage` 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