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, время: 17:22. |