2015-07-23 2 views
0
var test = null; 

$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
}); 

alert(test); 

Я всегда думал, что объявляю переменную извне функции до того, как рука предоставила доступ к переменной, даже если вызвана внутри функции. Однако моя тестовая переменная по-прежнему предупреждает об ошибке.Вызывающая переменная внутри функции jQuery извне

ответ

4

Вероятно, проблема с заказом, так как функция $.get является асинхронной. Обратный вызов get не запускается до тех пор, пока предупреждение не будет запущено.

Предупреждение запускается до того, как get завершен. Вы должны убедиться, что get завершен до предупреждения, вызывая предупреждение в обратном вызове.

Try:

var test = null; 

$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
    alert(test); 
}); 

или

var test = null; 

$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
    outside(); 
}); 

function outside() { alert(test); } 
+0

Ах хорошо, я понимаю. Поэтому, если я когда-либо захочу что-либо выполнить синхронно в javascript, мне нужно вызвать функции внутри функций. – derpyderp

+0

@derpyderp, или вы можете открыть что-то вроде 'promises' для себя .. –

0

Это потому, что вы используете переменный перед оператором прибудет выполнить полностью.

Тест получит значение при вызове обратного вызова функции get.

Если вы разместите предупреждение в функции get, то он будет звонить наконец.

1

он просто не назначен еще ..
Вы можете просто подождать, пока она:

var test = null, inprocess = true; 

$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
    inprocess = false; 
}); 

var wait = setInterval(function(){ 
    if (!inprocess) { 
    clearInterval(wait); 
    alert(test); 
    } 
}, 500); 

Но этот код ужасен. Гораздо лучше, чтобы вызвать функцию обратного вызова непосредственно:

var test = null; 
$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
    anyactionwithtest(test); 
    alert(test); 
}); 

Или использовать что-то вроде Jquery deffered обещание:

var test = null; 
$.get("/zeWebsite.php?blarg=421", function(data){ 
    test = data.trim(); 
}).done(function (data){ 
    // data also accessible here as is 
    alert(test); 
}); 
+0

Да на втором подходе нет нет нет на первом. –

+0

сначала это просто 'почему' демонстрация ... –

+0

Я редактирую свой ответ –

Смежные вопросы