2012-06-22 3 views
0

Я делаю вызовы jquery для получения и getJSON, но не могу получить доступ к возвращаемым значениям вне функции обратного вызова. Как я могу получить доступ к возвращенным данным?получить возвращаемые значения из jquery get?

 var firstid; 
     var nextid; 

    $.get(callUrl, function(data) { // call to add node 
     var n = data.indexOf("id-"); 
     var m = data.indexOf("id-"); 
     firstid = data.substr(n+3,m - (n+3)); 
     nextid = data.substr(m+3); 

      alert("firstid:" + firstid); // returns correct value 
    }); 

     alert("firstid:" + firstid); // returns undefined for firstid 

, как я могу получить начало вне функции?

+0

Любая [ответы] (http://stackoverflow.com/a/11156895/144665) help? – iambriansreed

ответ

5

ВСЕХ AJAX вызовов ASYNCHRONOUS

SO вы необходимость использовать обратные вызовы. что-нибудь вне этого вернет undefined.

$.get(callUrl, function(data) { // call to add node 
    var n = data.indexOf("id-"); 
    var m = data.indexOf("id-"); 
    firstid = data.substr(n+3,m - (n+3)); 
    nextid = data.substr(m+3); 

    doSomethingWithFirst(firstid); 
}); 

function doSomethingWithFirst(f) { 
    //NOW do something 
} 
+0

-1 Технически неправда. Если он завернул второе предупреждение («firstid:« + firstid »),« в тайм-ауте с 5-секундной задержкой он отобразит ожидаемый результат вне этой функции успеха. – iambriansreed

+0

@iambriansreed 5 секундная задержка ??? Как вы знаете, как долго сервер будет отвечать? – Neal

+0

Я не знаю точно, сколько времени сервер может предпринять, чтобы ответить, вы правы, но аргумент остается тем же: все, что выходит за пределы, которые получают обратный вызов, необязательно не определено. OP был прав, чтобы определить переменные за пределами области запроса get get, и из-за этого он обновляется, а последующие вызовы этой переменной действительно дают ожидаемые результаты. Наконец, не *** все *** AJAX-вызовы асинхронны, вы можете установить синхронный запрос, но ** не рекомендуется **. – iambriansreed

0

Это потому, что оно выполняется асинхронно (один из основных принципов AJAX). Вы можете установить значение async в false или использовать какую-либо другую конструкцию обратного вызова, чтобы использовать ваше значение, возвращаемое из вызова get.

0

Второй alert("firstid:" + firstid); возвращает undefined, так как на момент совершения является фактически undefined.

Первый alert("firstid:" + firstid); возвращает ожидаемый результат по мере его возникновения после того, как $.get закончил получение.

AJAX - Подставки для асинхронного JavaScript и XML. Асинхронные события - это события, происходящие независимо от основного потока программы. Пока вы может установить запрос в синхронный не рекомендуется.

Если вы завернули свой второй alert("firstid:" + firstid); в таймаут с 5-секундной задержкой, он отобразил ожидаемый результат.

setTimeout(function() { alert("firstid:" + firstid); }, 5000); 

Или вы могли бы обернуть второй alert("firstid:" + firstid); в интервале с 1-секундной задержкой, что в конечном итоге отображения ожидаемого результата.

var callback_interval = setInterval(function() { 
    if(typeof(firstid) == 'undefined') return; 
    clearInterval(callback_interval); 
    alert("firstid:" + firstid); 
}, 1000); 

Но лучше всего работать с переменными непосредственно в функцию обратного вызова $.get успеха или с помощью вызова функции в том, что успех обратного вызова.

+0

Любая причина для голосования? Мои факты не так? – iambriansreed

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