Google Chrome обмен сообщениями.
Пишу приложение для браузера.
Есть контент скрипт, он подключается только к определенному сайту и на определённую страницу. Есть фоновый скрипт, скрипт самого приложения, он всегда загружен. Нужен обмен сообщениями между этими скриптами, в любом направлении и количестве. Читал про долгоживущие сообщения - нихрена не понял, они могут отправлять к вкладке или нет? |
Кто может объяснить, могут ли накапливаться асинхронные ответы?
Вот контент скрипт: function sMcalback(response) // Функция-обработчик ответов на сообщения { switch(response.id) // Ответ { case 1: // Это мгновенный(синхронный) ответ { // Некий код break } case 2: // Это асинхронный ответ { // Некий код break } } return true } chrome.runtime.sendMessage({id: 1}, sMcalback) // Отправить сообщение, ответ не требуется chrome.runtime.sendMessage({id: 2}, sMcalback) // Отправить сообщение, ожидается мгновенный(синхронный) ответ chrome.runtime.sendMessage({id: 3}, sMcalback) // Отправить сообщение, ожидается ответ через некоторое время(асинхронный) Вот фоновый скрипт: chrome.runtime.onMessage.addListener // Отлов сообщений chrome.runtime.sendMessage ( function(request, sender, response) // Сообщение, какая-то инфа о отправителе, инфа для канала ответа { switch(request.id) { case 1: // Здесь не требуется ничего возвращать { // Некий код break } case 2: // А вот тут нужно вернуть ответ сразу(синхронно) { // Некий код response({id: 1}) // Вернуть ответ для chrome.runtime.sendMessage return false // Синхронный ответ break } case 3: // Тут нужно вернуть ответ спустя некоторое время(асинхронно), и не один { // Некий код, передача инфы для ответа и идентификатора ответа = {r: response, id: 2} break } } return true // Ответ на сообщение будет послан спустя некоторое время(асинхронно) } ) Сообщение из контент скрипта фоновому посылается 1 раз, и так же ожидается 1 ответ. Мне нужно 1 раз отправить сообщение, но ответов может быть хоть 100. Вот и хочу узнать может можно сохранять все "накопленные" асинхронные ответы, которые не были отправлены. И использовать их. Или же они уничтожаются при новом сообщении? Вот у меня при отправке: chrome.runtime.sendMessage({id: 1}, sMcalback) // Отправить сообщение, ответ не требуется Ответ никогда не отсылается, но он ожидается(возвращается true), получается где-то висит возможность ответить на это сообщение. Ведь если сначала отправить сообщение с асинхронным ответом, а потом с синхронным, и ответ синхронный не перебьёт асинхронный? Что написал сам не понял, в общем должно же работать(разработчики же не совсем идиоты)? Или делать так?: Когда отправляются сообщения не требующие ответа - закрывать их(отправлять мгновенный пустой ответ, или не назначать обработчик ответа - сообщение само отправится при возврате false), чтобы они не висели в памяти, или где они там висят. Когда нужно получить много ответов, после каждого ответа отправлять пустое сообщение с асинхронным ответом, и использовать его как следующий ответ. П.С. chrome.tabs.query - возможность отправлять сообщения из фонового в контент скрипт. Мне она не подходит, т.к. никак не узнать с какой страницы было послано сообщение. 1 - Страниц может быть много. А сами сообщения посылаются только когда нажимаешь кнопку. 2 - Страница может быть закрыта. |
Часовой пояс GMT +3, время: 13:38. |