sendResponse가 비동기 함수 또는 Promise의 해결을 기다리지 않음
이 문제는 chrome.runtime.onMessage를 비동기 함수 또는 Promise와 함께 사용할 때 발생합니다. 리스너에 결과를 반환합니다. Chrome은 현재 ManifestV3 및 V2 모두에 대해 onMessage의 반환 값에서 Promise를 지원하지 않습니다.
문제의 근본
onMessage 리스너는 리터럴 참 값이 유지되기를 기대합니다. sendResponse 함수를 위한 메시징 채널이 열려 있습니다. 그러나 리스너가 비동기로 선언되면 onMessage 구현에서 무시되는 Promise를 반환하여 사실상 포트를 닫고 호출자에게 정의되지 않은 값을 반환합니다.
리스너 호환 가능 만들기
이 문제를 해결하려면 리스너에서 async 키워드를 제거하고 리스너 내에서 호출되는 별도의 비동기 함수를 생성하면 됩니다. 리스너:
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 }
API 패치
대안으로 패치를 API에 적용하여 비동기 리스너를 허용할 수 있습니다.
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); }); }
이 패치를 사용하면 다음과 같이 리스너로부터 직접 Promise 또는 값을 반환할 수 있습니다. 그래서:
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의 `chrome.runtime.onMessage`에서 비동기 기능을 기다리지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!