Показать сообщение отдельно
  #1 (permalink)  
Старый 13.12.2014, 05:05
Интересующийся
Отправить личное сообщение для mpak Посмотреть профиль Найти все сообщения от mpak
 
Регистрация: 13.12.2014
Сообщений: 13

Бьюсь уже третий день не могу найти решение.
Делаю свое приложение под хром. И наткнулся на проблему которую не получается обойти. Смысл такой. От верхней функции получаю 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

Последний раз редактировалось mpak, 13.12.2014 в 05:16.
Ответить с цитированием