ホームページ > ウェブフロントエンド > jsチュートリアル > Chrome 拡張機能で「sendResponse」を非同期関数で待機させるにはどうすればよいですか?

Chrome 拡張機能で「sendResponse」を非同期関数で待機させるにはどうすればよいですか?

DDD
リリース: 2024-11-23 20:21:09
オリジナル
190 人が閲覧しました

How Can I Make `sendResponse` Wait for Async Functions in Chrome Extensions?

sendResponse が非同期関数を待機し、Promise が解決される

問題: Chrome 拡張機能では、contentscript の sendResponse() .js は getThumbnails() のために一時停止しません。 finish.

説明: Chrome の chrome.runtime.onMessage イベント リスナーは、sendResponse に対してチャネルを開いたままにしておく必要があるかどうかを示すブール値を返します。非同期関数または Promise が返されると、Chrome は Promise を無視してチャネルをすぐに閉じます。

解決策: イベント リスナーを非同期関数と互換性のあるものにします:

  1. async キーワードを削除: イベント リスナーの先頭から async キーワードを削除します。 function.
  2. 個別の非同期関数を定義します: メッセージ処理を処理する個別の非同期関数を作成します。イベント リスナー内からこの関数を呼び出します。

例:

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) {
  console.log('Processing message', msg);
  // ... Handle the message processing here ...
  return 'foo';
}
ログイン後にコピー

代替解決策: API にパッチを適用します

次のコードを、次のコードを使用するすべてのスクリプトの先頭に追加します。 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);
  });
}
ログイン後にコピー

このパッチにより、イベント リスナーが非同期関数または Promise を返すことができるようになります。

以上がChrome 拡張機能で「sendResponse」を非同期関数で待機させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート