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!