> 웹 프론트엔드 > JS 튜토리얼 > `sendResponse`가 Chrome의 `chrome.runtime.onMessage`에서 비동기 기능을 기다리지 않는 이유는 무엇입니까?

`sendResponse`가 Chrome의 `chrome.runtime.onMessage`에서 비동기 기능을 기다리지 않는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-23 06:49:21
원래의
974명이 탐색했습니다.

Why Doesn't `sendResponse` Wait for Async Functions in Chrome's `chrome.runtime.onMessage`?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿