sendResponse가 비동기 함수 또는 Promise의 해결을 기다리지 않음
문제:
sendResponse()의 비동기성 문제 contentscript.js에서는 getThumbnails()까지 일시 중지되지 않습니다. 반환합니다. 또한 getThumbnails()의 페이로드는 null인 경우가 많아 실행이 불완전할 수 있음을 나타냅니다.
분석:
Chrome은 ManifestV3 및 ManifestV3 모두에서 onMessage 리스너의 반환 값에 대한 약속을 지원하지 않습니다. V2. 이는 비동기 리스너가 반환한 sendResponse Promise가 무시되고 포트가 즉시 닫히는 것을 의미합니다.
해결책:
리스너를 호환되게 하려면:
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'; }
비동기/Promise 리스너를 허용하도록 API를 패치하려면:
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}; } });
위 내용은 `sendResponse`가 Chrome 확장 프로그램의 `onMessage` 리스너에서 내 비동기 기능을 기다리지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!