Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   не своевременное исполнение функции (https://javascript.ru/forum/misc/34281-ne-svoevremennoe-ispolnenie-funkcii.html)

Andrey-Iz 27.12.2012 15:45

не своевременное исполнение функции
 
Делаю первые шаги в написании userscript-ов. Столкнулся с проблемой когда результат выполнения функции появляется позже, чем исполняются следующие за ней операторы.(Конечно сужу по алертам, могу и ошибаться, тем более ошибка где-то ведь существует). Был бы рад помощи.
Вот фрагмент:
// вызов
           var kk=0;
	var kk=rez_snab (urlsnab);
	alert(kk);
//.................................................
    function rez_snab(url2) {
      var k=0
      	$.get(url2, function(data) {
	  k=2;
	alert(k);
         });
	alert(k);
	return k;
    }

По алертам получается: 0(kk), 2(k) , 2(k). Хотелось бы понять почему kk!=2.

Deff 27.12.2012 15:55

Andrey-Iz,
У Вас ассинхронный Аякс, поэтому обработку ставим в саllback Аякс функции (или вызывайте из саllback доп функцию обработки/отображения

Andrey-Iz 27.12.2012 16:08

К своему стыду не понимаю вашего ответа. Может чуток по расширенней.

skfyann 27.12.2012 16:23

function(data) выполнится после того, как будет получен ответ от сервера.
Так как запрос асинхронный, то пока нет ответа будет выполняться весь остальной код.
Но у вас получается так, если я не ошибаюсь.
0(k) -> приходит ответ, k=2 -> 2(k) -> 2(kk)

Andrey-Iz 27.12.2012 16:34

skfyann, если я правильно понял, то как сделать чтобы основная функция "ждала" function(data) ?

Deff 27.12.2012 16:36

Цитата:

Сообщение от Andrey-Iz
skfyann, если я правильно понял, то как сделать чтобы основная функция "ждала" function(data) ?

Вызов основной функции(вместе с передаваемыми параметрами) делаете в концовке function(data)

Andrey-Iz 27.12.2012 16:38

skfyann, и по алертам именно так :0(kk), 2(k) , 2(k)
Т.е. var kk=rez_snab (urlsnab) как-бы игнорируется.

Deff 27.12.2012 16:39

// вызов
           var kk=0;
	var kk=rez_snab (urlsnab);
//Обработка
    function MyFunc(k,gata) {
      	  alert(k);
    }
//.................................................
    function rez_snab(url2) {
      var k=0
      	$.get(url2, function(data) {
      	   k=2; MyFunc(k,gata) ;
         });
    }

Andrey-Iz 27.12.2012 21:00

Deff, прошу прощения что не сразу отвечаю.(дела)
Спасибо. Скопировал ваш вариант. Вашу мысль вроде понял, но вот скрипт нет.

Цитата:

Сообщение от Andrey-Iz
var kk=rez_snab (urlsnab) как-бы игнорируется.

Не верно. Игнорируется(пропускается) конкретно это:
$.get(url2, function(data) {
	           k=2; MyFunc(k,data) ;
	         });

Исправил в вызове gata на data. Понимаю что так должно быть.

Andrey-Iz 27.12.2012 21:15

Т.е последовательность такова:
к=0
$... - пропускается
кк = к //т.е.=0
$... - cрабатывает
к=2
Но уже поздно. кк получено и =0
:(


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