ホームページ > 記事 > ウェブフロントエンド > Chrome 拡張機能で「sendResponse」を非同期関数で待機させるにはどうすればよいですか?
sendResponse が非同期関数を待機し、Promise が解決される
問題: Chrome 拡張機能では、contentscript の sendResponse() .js は getThumbnails() のために一時停止しません。 finish.
説明: Chrome の chrome.runtime.onMessage イベント リスナーは、sendResponse に対してチャネルを開いたままにしておく必要があるかどうかを示すブール値を返します。非同期関数または Promise が返されると、Chrome は Promise を無視してチャネルをすぐに閉じます。
解決策: イベント リスナーを非同期関数と互換性のあるものにします:
例:
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 サイトの他の関連記事を参照してください。