Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 13.12.2014, 16:22
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Тебе нужно добавить "return true;" в конец функции "ЛовимВызовыСоСтраницы"
Ответить с цитированием
  #3 (permalink)  
Старый 13.12.2014, 18:20
Интересующийся
Отправить личное сообщение для mpak Посмотреть профиль Найти все сообщения от mpak
 
Регистрация: 13.12.2014
Сообщений: 13

Сообщение от Яростный Меч Посмотреть сообщение
Тебе нужно добавить "return true;" в конец функции "ЛовимВызовыСоСтраницы"
Пробовал. Это написано на странице бага. Все равно фукнкция выполняется синхронно. Я всеже склонен, что это баг хромиума. Последнее сообщение на странице с багом лето этого года. Возможно, что просто никто не натыкался за это время и бага все еще актуальна.
Ответить с цитированием
  #4 (permalink)  
Старый 13.12.2014, 19:21
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

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

Но sendResponse в любом случае должен вызваться. А если условие на 4 строке истинно, он не вызовется.
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2014, 00:18
Интересующийся
Отправить личное сообщение для mpak Посмотреть профиль Найти все сообщения от mpak
 
Регистрация: 13.12.2014
Сообщений: 13

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Решение задачки, нигде не могу найти. Mr_ZET Общие вопросы Javascript 6 10.11.2014 08:13
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
[FF+GM] Проверьте пжл. скрипт(не могу найти ошибку) Benos Firefox/Mozilla 4 30.03.2013 17:46
Не могу найти ошибку nemo4430 Общие вопросы Javascript 6 26.11.2012 23:33
никак не могу найти ошибку. наследование AmniCat Events/DOM/Window 3 17.11.2011 00:50