2012-07-08 41 views
4

一些奇怪的事情是怎麼回事...我有以下功能他:使用getJSON時,如何捕獲響應數據?

getInviteLink : function() { 
    var me = this, 
     invite_url; 

    $.getJSON('get_invite_code.json', function(data) { 
     console.log(data.invite_url); 
     invite_url = data.invite_url; 
    }); 

    console.log(invite_url) 

    return invite_url; 
}, 

在運行此,對於第一個控制檯日誌返回正確的值。但是,在第二個控制檯日誌中沒有任何內容。爲什麼不能從getJSON函數內設置invite_url?

謝謝

回答

1

它設置它,但異步。回調函數只在服務器響應到達後才被調用。一旦發送請求,$.getJSON函數就會返回,所以在調用回調函數之前,「second」console.log實際上會首先發生。

您不能編寫像這樣的函數來同步返回異步服務器請求的結果。

+0

建議修改? Inser成功的回報? – AnApprentice 2012-07-08 02:21:32

+0

對不起,但你不能返回值。你不能建立一個同步函數,它返回異步請求的值。您可以做的最好的方法是使用成功回調中的值。 – 2012-07-08 02:22:33

3

因爲getJSON方法是異步的。這是怎麼回事...

getInviteLink : function() { // this function is called... 
    var me = this, 
    invite_url;    // happens right away 

    $.getJSON('get_invite_code.json', function(data) { 
     // Step 2, these statements don't happen until later 
     // -- when the response is received 
     console.log(data.invite_url); // this 
     invite_url = data.invite_url; 
    }); // Step 1. the getJSON is called right away 

    console.log(invite_url) // this happens right after the 
          // the getJSON is called, but before 
          // it gets a response. Thus no data when the log 
          // statement is invoked 

    return invite_url;  // also no data (yet) when this return statement 
          // is executed 
}, 

添加要解決你的軟件,你需要認識到,你不能做的事情invite_url從服務器接收到的JSON響應之後,直到。 - 如果您的客戶端出現網絡問題或服務器問題,可能永遠不會收到。

您可以將函數傳遞給您的getJSON調用。該函數將使用invite_url。同時,您可以爲您的客戶做其他事情。

如果你的軟件沒有任何東西可以做,直到你得到響應,然後設置一個忙指標(一個旋轉的圓圈或者其他東西),然後啓動json請求並且當你得到響應時讓函數取消忙指標背部。

有關更多信息,請參閱jQuery json文檔。

+0

非常有幫助謝謝,有關如何使這項工作的任何建議? – AnApprentice 2012-07-08 02:24:10

2

你無法獲得invite_url作爲返回值在代碼中使用getJSON。如果您想使用inviteURL,則需要使用回調函數進行重構。

在這種情況下,如果您看到控制檯的順序。它將首先執行invite_url,然後執行data.invite_url。原因是getJSON是異步調用。要使這個工作,你需要調用獲取JSON與異步:false與不可能的,你需要使用$ .ajax與datatyoe json。以下示例將匹配您需要的內容。

getInviteLink: function() { 
    var me = this, 
     invite_url; 

    $.ajax({ 
     url: 'get_invite_code.json', 
     dataType: 'json', 
     async: false, 
     success: function(data) { 
      console.log(data.invite_url); 
      invite_url = data.invite_url; 
     } 
    }); 

    console.log(invite_url) 

    return invite_url; 
}, 

我如果返回不是強制性的,我建議重構代碼並使用回調函數,而不是async false。所以你可以用getJSON