Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Google Chrome обмен сообщениями. (https://javascript.ru/forum/misc/66700-google-chrome-obmen-soobshheniyami.html)

Артист 04.01.2017 06:03

Google Chrome обмен сообщениями.
 
Пишу приложение для браузера.
Есть контент скрипт, он подключается только к определенному сайту и на определённую страницу.
Есть фоновый скрипт, скрипт самого приложения, он всегда загружен.

Нужен обмен сообщениями между этими скриптами, в любом направлении и количестве.

Читал про долгоживущие сообщения - нихрена не понял, они могут отправлять к вкладке или нет?

Артист 05.01.2017 05:27

Кто может объяснить, могут ли накапливаться асинхронные ответы?

Вот контент скрипт:
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, время: 09:38.