Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Бьюсь уже третий день не могу найти решение. (https://javascript.ru/forum/misc/52312-byus-uzhe-tretijj-den-ne-mogu-najjti-reshenie.html)

mpak 13.12.2014 05:05

Бьюсь уже третий день не могу найти решение.
 
Делаю свое приложение под хром. И наткнулся на проблему которую не получается обойти. Смысл такой. От верхней функции получаю callback по ходу обработки функции нужно вызвать несколько своих. На первом уровне callback срабатывает, но как только ставлю его во вложенную функцию он перестает работать. Думаю это как то связано с асинхронностью, но не могу понять как это можно обойти. Вот код

# Функция из которой получаем sendResponse

chrome.runtime.onMessage.addListener(function ЛовимВызовыСоСтраницы(request, sender, sendResponse){

chrome.tabs.query({pinned:true, "url":request.location.url}, function ПроверкаСвойстТаба(tabs){
	if(tabs.length){
		chrome.tabs.update(tabs[0].id, {selected: true});
		chrome.tabs.reload(tabs[0].id);
	}else{
		chrome.tabs.create({pinned:true, url:request.location.url}, function СозданиеТаба(tab){
			chrome.tabs.onRemoved.addListener(function ПолучаемСвойстваВкладки(tabId){
				chrome.tabs.update(sender.tab.id, {selected: true});
				console.log("onRemoved:", (new Date().getTime()));
###################################################
# Если ставим сюда, то не работает. А нужно здесь. Ниже работает
###################################################
				sendResponse({storage:localStorage});
			})
			request.location.tab = tab;
			if(localStorage["location"].length == 0){
				localStorage["location"] = JSON.stringify([request.location]);
			}else{
				var location = JSON.parse(localStorage["location"]);
				location.push(request.location);
				localStorage["location"] = JSON.stringify(location);
			} console.log("localStorage.location:", localStorage.location);
		});
	};
	return true;
});
console.log("query:", (new Date().getTime()));
###################################################
# Если ставим sendResponse здесь он работает, но мне надо поставить его выше
###################################################
sendResponse({storage:localStorage});

В общем такая заморочка. Бьюсь уже не один день.


Названия русских функция на работу не сказываются. Сделано так, ради удобства чтобы в дебагере иметь возможность отличать одну безымянную функцию от другой. Функции с русскими именами в вызовах не используются.

В документации находил информцаии о вставке в функцию return true типа после этого она начинает работать асинхронно, но у меня куда бы я не ставил добиться асинхронности не получилось.
Здесь описание метода onMessage
https://developer.chrome.com/extensi...e-sendResponse

А еще есть баги. Не могу понять исправлены они или нет

https://code.google.com/p/chromium/i...tail?id=330415
https://groups.google.com/a/chromium...ns/C9RQuRWddj4

Яростный Меч 13.12.2014 16:22

Тебе нужно добавить "return true;" в конец функции "ЛовимВызовыСоСтраницы"

mpak 13.12.2014 18:20

Цитата:

Сообщение от Яростный Меч (Сообщение 346317)
Тебе нужно добавить "return true;" в конец функции "ЛовимВызовыСоСтраницы"

Пробовал. Это написано на странице бага. Все равно фукнкция выполняется синхронно. Я всеже склонен, что это баг хромиума. Последнее сообщение на странице с багом лето этого года. Возможно, что просто никто не натыкался за это время и бага все еще актуальна.

Яростный Меч 13.12.2014 19:21

Надо из 33 строки убрать нахрен вызов sendResponse и воткнуть туда return true.
Тогда sendResponse на 15 строке нормально отправит данные.

Но sendResponse в любом случае должен вызваться. А если условие на 4 строке истинно, он не вызовется.

mpak 15.12.2014 00:18

Ставить выход пробовал. Это не прокатывает. Этот способ описан много где, но под моим бразуером Ubuntu Linux Chromium он не сработал. Возможно какой то баз конкретно моей сборги хромиума.


Часовой пояс GMT +3, время: 12:02.