2012-08-29 41 views
4

我有這樣的方法:爲什麼jQuery.getJSON不返回任何數據?

function getUserName(guid) { 
    var name = "Unbekannt"; 

    $.getJSON(urlCurrent, { 
     "method" : "get_user_info", 
     "guid" : guid, 
     "auth_token" : temporaryAuthToken 
    }, function(data) { 
     if (data.status == 0) { 
      alert(data.result[0].name); 
      name = data.result[0].name; 
     } 
    }); 

    return name; 
} 

幾乎所有的工作:阿賈克斯請求獲取數據,並觸發回調函數,使

​​

顯示了該值的彈出:「用的名字姓」

但隨後在

return name; 

的甲基od返回「Unbekannt」,儘管名稱應該具有新值「Forename Surname」。 發生了什麼以及哪裏出錯?

THX Ajax調用已經返回之前

+1

對getJSON的調用是異步的。因此,在「返回名稱」處,數據可能不會到達。 –

回答

4

我會從函數返回的承諾對象,並對其採取行動。

function getUserName(guid) { 
    return $.getJSON(urlCurrent, { 
     "method" : "get_user_info", 
     "guid" : guid, 
     "auth_token" : temporaryAuthToken 
    }); 
} 

getUserName(guid).done(function(data) { 
    if (data.status == 0) { 
     alert(data.result[0].name); 
    } 
}); 

而且,如果你想要做的狀態檢查前面,。然後是好了點。

function getUserName(guid) { 
    return $.getJSON(urlCurrent, { 
     "method" : "get_user_info", 
     "guid" : guid, 
     "auth_token" : temporaryAuthToken 
    }).then(function(data){ 
     return $.Deferred(function(def){ 
      if (data.status == 0) { 
       return def.resolve(data); 
      } 
      return def.reject(data); 
     }); 
    }); 
} 

getUserName(guid).done(function(data) { 
    alert(data.result[0].name); 
}); 
+0

+1我喜歡承諾語法比回調更好 – David

+0

雖然這個工程,這意味着你需要重複'.status == 0'檢查每個地方的getUserName是如果你把這部分保存在'getUserName'函數中會更好 –

+0

@David它提供了更多的功能;現在你可以給它一個'fail'或'always'回調函數,把它與其他promise對象結合起來使用'$ .when',或者使用'.then'(仍然不確定1.8.0更改對'.then'做了什麼,儘管如此,需要更多的研究。) –

2

因爲return name;進行了很多。

如果您希望它與在$.getJSON()調用中返回的數據相關聯,它也需要位於回調函數中。

+1

但是,重要的是要注意,從回調中返回數據不會產生任何影響。 –

+0

這是我的其他嘗試之一。這並沒有工作: – alexh

3

當你返回name它還沒有被分配你從getJSON回調得到的新值,因爲ajax調用是異步的並且需要一些時間才能完成。

你需要帶一個回調函數:

function getUserName(guid, callback) { 
    var name = "Unbekannt"; 

    $.getJSON(urlCurrent, { 
     "method" : "coinor.get_user_info", 
     "guid" : guid, 
     "auth_token" : temporaryAuthToken 
    }, function(data) { 
     if (data.status == 0) { 
      alert(data.result[0].name); 
      name = data.result[0].name; 
      callback(name); 
     } 
    }); 
} 

getUserName(guid, function(name) { 
    alert(name); 
});