Javascript.RU

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

JS видимость колбека внутри колбека?
У меня есть код (расширение для хрома), который я не понимаю из-за особенностей js

chrome.runtime.onMessage.addListener(
  function(message, sender, sendResponse)
  {
    $.ajax({
      url: "http://some.site"
      ,type: "POST"
      ,data: message
      ,success: function(data)
      {
        sendResponse('работает аякс');
      }
    });
    
    sendResponse('просто');
  }
);


Почему функция sendResponse('работает аякс'); не срабатывает? Подозреваю, что я пытаюсь вызвать sendResponse не в том контексте.
Как нужно правильно читать этот код?
И как добиться того чтобы колбек success от аякса, смог вызвать sendResponse?
Ответить с цитированием
  #2 (permalink)  
Старый 24.08.2017, 10:27
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

paka, из того, что ты куда-то передал безымянную функцию с кучей параметров не значит, что ее вызовут с теми параметрами...
Ответить с цитированием
  #3 (permalink)  
Старый 24.08.2017, 10:31
Новичок на форуме
Отправить личное сообщение для paka Посмотреть профиль Найти все сообщения от paka
 
Регистрация: 24.08.2017
Сообщений: 4

я не понимаю, почему вызов
sendResponse('просто'); // работает
а вызов из аякса
sendResponse('работает аякс'); // не работает

Прошу мне подсказать, как нужно читать код?
Ответить с цитированием
  #4 (permalink)  
Старый 24.08.2017, 10:47
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

paka, ты передал куда-то безымянную функцию с кучей параметров...

Ты знаешь как потом ту функцию будут вызывать? Ее будут вызывать с нужными параметрами?

Если ее вызовут без параметров - первая же попытка использовать их внутри безымянной функции будет вызывать ошибку.
Ответить с цитированием
  #5 (permalink)  
Старый 24.08.2017, 10:52
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от paka
Прошу мне подсказать, как нужно читать код?
Вот примерно похожий на твой вариант код...

function message(Txt) {
	alert(Txt)
};
setTimeout(function(Txt,message){
	message(Txt)
},1000);

Не работающий конечно...

Т.е. одного начертания имен функций и переменных не хватит для правильной работы кода.
Ответить с цитированием
  #6 (permalink)  
Старый 24.08.2017, 10:53
Новичок на форуме
Отправить личное сообщение для paka Посмотреть профиль Найти все сообщения от paka
 
Регистрация: 24.08.2017
Сообщений: 4

Цитата:
ты передал куда-то безымянную функцию с кучей параметров...
вы каку строчку имеете ввиду?
Ответить с цитированием
  #7 (permalink)  
Старый 24.08.2017, 10:58
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

paka, вот рабочий вариант с использование калбек-функции с параметрами...

function message(Txt) {
	alert(Txt)
};
setTimeout((function (Mess,Fnc){
return function(){
	Fnc(Mess);
}
})('Test',message),1000);
Ответить с цитированием
  #8 (permalink)  
Старый 24.08.2017, 11:00
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от paka
вы каку строчку имеете ввиду?
Вот эту конечно.
Сообщение от paka
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){/*...*/})
Ответить с цитированием
  #9 (permalink)  
Старый 24.08.2017, 11:08
Новичок на форуме
Отправить личное сообщение для paka Посмотреть профиль Найти все сообщения от paka
 
Регистрация: 24.08.2017
Сообщений: 4

У меня проблема в том, что строка 14 выпоняется, те.
sendResponse('просто'); // работает

а вызов тойже функциии из строки 10
sendResponse('работает аякс'); // не работает

возможно вы уже ответили или я не туда смотрю?
Ответить с цитированием
  #10 (permalink)  
Старый 24.08.2017, 11:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от paka
строка 14 выпоняется, те.
sendResponse('просто'); // работает
Тогда уже лучше!

Остается только правильно "оформить" success. Например так

chrome.runtime.onMessage.addListener(
	function(message, sender, sendResponse) {
		$.ajax({
			url: "http://some.site"
			,type: "POST"
			,data: message
			,success: (function(Fnc){
				return function(data){
					Fnc('работает аякс');
				}
			})(sendResponse)
		});
		endResponse('просто');
	}
);
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операционная Система на JS Icat Общие вопросы Javascript 3 17.04.2018 22:54
Не получается вставить код js в HTML garmoni Элементы интерфейса 3 05.09.2013 05:56
Как рандомно запустить js внутри другого js? fonzo24 Общие вопросы Javascript 3 21.11.2011 13:31
JS внутри AJAX pagal AJAX и COMET 8 11.10.2011 11:19
Как получит ссылку на элемент внутри которого запустили JS код? aRpi Events/DOM/Window 20 02.10.2011 13:36