sendResponse Tidak Menunggu Fungsi Async atau Penyelesaian Janji
Masalah:
Isu ketaksinkronan di mana sendResponse() dalam contentscript.js tidak berhenti seketika sehingga getThumbnails() kembali. Selain itu, muatan dalam getThumbnails() selalunya batal, menunjukkan kemungkinan pelaksanaan tidak lengkap.
Analisis:
Chrome tidak menyokong Promises dalam nilai yang dikembalikan pendengar onMessage dalam kedua-dua ManifestV3 dan V2. Ini bermakna SendResponse Promise yang dikembalikan oleh pendengar async diabaikan dan port ditutup serta-merta.
Penyelesaian:
Untuk menjadikan pendengar serasi:
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { if (msg.message === "get_thumbnails") { processMessage(msg).then(sendResponse); return true; // keep the messaging channel open for sendResponse } }); async function processMessage(msg) { console.log('Processing message', msg); // ................. return 'foo'; }
Untuk menampal API untuk membenarkan pendengar async/Promise:
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); }); }
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 `SendResponse` Tidak Menunggu Fungsi Async Saya dalam Pendengar `onMessage` Sambungan Chrome?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!