Кто может объяснить, могут ли накапливаться асинхронные ответы?
Вот контент скрипт:
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 - Страница может быть закрыта.