2013-01-11 32 views
0

我的函數在下面進行調用,因爲它是一個無效的JSON對象,我必須手動將結果解析爲有效的JSON對象。問題是當我傳遞JSON對象回到原始調用函數時,對象無法正確傳回。在函數之間傳遞JSON對象的時間問題創建錯誤

如果我只把第三個警報放在它裏面會說對象的'無效'。但是,如果我把所有三個警報放入,只有警報2會說無效(1和3將顯示對象)。這使得相信這可能是在這些變量之間傳遞對象的某種類型的時序問題。任何關於如何解決這個問題的建議,因爲我顯然不能在我的最終代碼中放置警報。

function loadDocuments(){ 
     var myDocuments = getDocs(); 
     alert('third response ' + myDocuments); 
    } 

    function getDocs() {    
      var myURL = "someURL"; 
      var response; 
      $.ajax({ 
       url: myURL, 
       type: 'GET', 
       dataType: 'json', 
       complete: function(docData) { 
        if(docData.status==200){ 
         response = parseDocResults(docData.responseText); 
         alert('first response' + response);             
        }else{ 
         response = "Documents failed to load"; 
        } 
       } 
      }); 
      alert('second response' + response); 
     return response; 
    } 
+0

AJAX是異步的,在這裏你返回值邏輯不能作品 –

+0

但我不觸發回調,直到「完整」 – silvster27

+0

反正有沒有做到這一點? (解析結果並將它們傳回)? – silvster27

回答

1

以您試過的方式使用AJAX意味着在synchronous方法中使用它,該方法阻止瀏覽器直到傳輸完成。您可以在$.ajax()函數中找到async配置標誌,該標誌使得AJAX在設置爲false時同步工作,但我不會推薦它(並且它也被棄用)。

$.ajax()函數只是向服務器發送一個HTTP請求。它不會等待它立即返回的答覆,並且繼續執行ajax函數調用之後的任何指令。

稍後,瀏覽器(JavaScript)從服務器接收HTTP響應。您的ajax函數調用指定了一個用於處理HTTP響應的回調函數complete/success。但是由於回調是在「稍後」執行的,因此您必須從回調中調整邏輯,而不必依賴返回值。

+0

基於這個答案,我所做的就是將所有下游邏輯直接放入AJAX調用的響應部分,並在調用之後返回任何內容。這當然有效。謝謝。 – silvster27

0

你可以做到這一點,就像這樣:

var myDocuments; 

getDocs(); //call getDocs() instead of loadDocuments() in your coding logic 

function loadDocuments(response){ 
     myDocuments = response; 
     alert(myDocuments); 
    } 

    function getDocs() {    
      var myURL = "someURL"; 
      var response; 
      $.ajax({ 
       url: myURL, 
       type: 'GET', 
       dataType: 'json', 
       complete: function(docData) { 
        if(docData.status==200){ 
         response = parseDocResults(docData.responseText); 
         alert('first response' + response);             
        }else{ 
         response = "Documents failed to load"; 
        } 

        loadDocuments(response); 
       } 
      });    
    }