Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JS видимость колбека внутри колбека? (https://javascript.ru/forum/misc/70281-js-vidimost-kolbeka-vnutri-kolbeka.html)

paka 24.08.2017 10:20

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?

ksa 24.08.2017 10:27

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

paka 24.08.2017 10:31

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

Прошу мне подсказать, как нужно читать код?

ksa 24.08.2017 10:47

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

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

Если ее вызовут без параметров - первая же попытка использовать их внутри безымянной функции будет вызывать ошибку.

ksa 24.08.2017 10:52

Цитата:

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

Вот примерно похожий на твой вариант код...

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

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

Т.е. одного начертания имен функций и переменных не хватит для правильной работы кода.

paka 24.08.2017 10:53

Цитата:

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

ksa 24.08.2017 10:58

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

function message(Txt) {
	alert(Txt)
};
setTimeout((function (Mess,Fnc){
return function(){
	Fnc(Mess);
}
})('Test',message),1000);

ksa 24.08.2017 11:00

Цитата:

Сообщение от paka
вы каку строчку имеете ввиду?

Вот эту конечно.
Цитата:

Сообщение от paka
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse){/*...*/})


paka 24.08.2017 11:08

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

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

возможно вы уже ответили или я не туда смотрю?

ksa 24.08.2017 11:31

Цитата:

Сообщение от 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('просто');
	}
);


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