>웹 프론트엔드 >JS 튜토리얼 >`sendResponse`가 Chrome 확장 프로그램의 `onMessage` 리스너에서 내 비동기 기능을 기다리지 않는 이유는 무엇입니까?

`sendResponse`가 Chrome 확장 프로그램의 `onMessage` 리스너에서 내 비동기 기능을 기다리지 않는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-26 04:02:08482검색

Why Doesn't `sendResponse` Wait for My Async Function in a Chrome Extension's `onMessage` Listener?

sendResponse가 비동기 함수 또는 Promise의 해결을 기다리지 않음

문제:
sendResponse()의 비동기성 문제 contentscript.js에서는 getThumbnails()까지 일시 중지되지 않습니다. 반환합니다. 또한 getThumbnails()의 페이로드는 null인 경우가 많아 실행이 불완전할 수 있음을 나타냅니다.

분석:
Chrome은 ManifestV3 및 ManifestV3 모두에서 onMessage 리스너의 반환 값에 대한 약속을 지원하지 않습니다. V2. 이는 비동기 리스너가 반환한 sendResponse Promise가 무시되고 포트가 즉시 닫히는 것을 의미합니다.

해결책:
리스너를 호환되게 하려면:

  1. onMessage 이벤트에서 async 키워드를 제거하세요. 리스너.
  2. 별도의 비동기 함수를 생성하고 이벤트 리스너에서 호출합니다. 예:
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를 패치하려면:

  1. 다음 코드를 상단에 추가합니다. 사용하는 각 스크립트 chrome.runtime.onMessage:
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);
  });
}
  1. 그런 다음 간단히 비동기 리스너에서 값을 반환할 수 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.