Chrome拡張機能-メッセージが同期的および非同期的に渡される



Chrome Extension Message Passing Synchronously Asynchronously



Chrome拡張機能のドキュメントにそのような文があります。 sendResponse was called synchronously. If you want to asynchronously use sendResponse, add return true to the onMessage event handler.

その文書を初めて見たとき、私はそれを理解しました。私は一度ピットインしました。 sendMessageが返されない後、ドキュメントにそのような文が含まれているように見えたことを思い出しました。



以下に例を示します。

contentscriptsendMessageなど



// in contentscript.js chrome.runtime.sendMessage({to: 'background', subject: 'asyncCall'}, function(data){ console.log(data) })

バックグラウンド内のリスナーコードは次のとおりです。

chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { if(request.subject == 'asyncCall'){ setTimeout(function(){ sendResponse('called') }, 1000) } })

しかし、ログの結果はundefinedです。
応答は非同期で呼び出す必要があり、ドキュメントにはsendResponse was called synchronouslyと記載されているためです。

結果を返したい場合は、以下のようにreturn true、codeshowを追加する必要があります



chrome.runtime.onMessage.addListener( function (request, sender, sendResponse) { if(request.subject == 'asyncCall'){ setTimeout(function(){ sendResponse('called') }, 1000) return true } })