2012-06-22 103 views
0

我正在jquery調用get和getJSON,但不能訪問回調函數外的返回值。我怎樣才能訪問返回的數據?從jquery獲取返回的值嗎?

 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 

我怎樣才能得到firstid功能以外?

+0

任何[answers](http://stackoverflow.com/a/11156895/144665)有幫助嗎? – iambriansreed

回答

5

所有的Ajax調用是異步

,所以你需要使用回調。除此之外的任何內容都將返回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技術上不正確。如果他將第二個alert(「firstid:」+ firstid);'以超過5秒的延遲超時,它會在該成功函數外顯示預期結果。 – iambriansreed

+0

@iambriansreed 5秒延遲?你如何知道服務器需要做出反應? – Neal

+0

我不確定服務器可能需要多長時間才能做出響應,您是對的,但參數仍然相同:除回調之外的任何內容都不一定是未定義的。 OP在「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); 

或者你可以在1點秒鐘的延遲它最終會顯示預期的結果的間隔包裹你的第二個alert("firstid:" + firstid);

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

但最好與變量直接在$.get成功回調或者通過功能的工作,成功回調中調用。

+0

反對的任何理由?我的事實錯了? – iambriansreed