2014-08-27 66 views
1

這是我第一次嘗試做延期功能,我明顯地發現了錯誤。我有點困惑,有這樣做的顯然幾種方法,但我想從最簡單的工作,我能找到延期getJSON的回報是未定義的

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    var def = $.Deferred(); 
    $.getJSON(url).done(function(data){ 
     console.log(data['name']); 
     def.resolve({ 
      data:data 
     }); 
    }); 
    return def; 
} 

我的控制檯輸出爲:

John 
undefined 

(約翰是預期的名稱)

我懷疑這是def.resolve部分,我錯了。

回答

3

你的主要問題是,你用錯了鑰匙:

務必:

Get_JSON(my_url).done(function(data) { 
    console.log(data.data['name']); 
}); 

但是,可以簡化您的代碼如下:

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    return $.getJSON(url); 
} 

甚至對此:

$.getJSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

基本上,$.getJSON已經返回一個Deferred對象,並且您的代碼通過代理添加冗餘。

+0

+1避免不必要的函數代理 – pomeh 2014-08-27 22:15:00

+0

考慮'console.dir(data)',它可以讓你檢查'data'的所有屬性,而不僅僅是'.name'。 – 2014-08-28 00:51:11

1

這是正確的行爲。在你的resolve調用中,你傳遞了一個對象{data: data}(我們稱之爲對象A),因此它是一個對象,它有一個data鍵,而哪個值是來自$.getJSON(url).done回調(我們稱之爲對象B)的data對象。這最後一個對象有一個name關鍵,但你在Get_JSON(my_url).done回調檢索對象爲對象A(只具有data鍵),而不是對象B.

你應該寫你這樣的代碼:

Get_JSON(my_url).done(function(data) { 
    console.log(data['name']); 
}); 

function Get_JSON(url) { 
    var def = $.Deferred(); 
    $.getJSON(url).done(function(data){ 
     console.log(data['name']); 
     def.resolve(data); // here is the only difference 
    }); 
    return def; 
} 
+0

由於'。.getJSON()'已經返回一個承諾,所以沒有必要繼續創建延期 - 不妨使用那個。 – jfriend00 2014-08-27 21:52:05

+0

@ jfriend00你是絕對正確的,這就是爲什麼我已經upvote tcooc答案。但這不是我答案的主要觀點 – pomeh 2014-08-27 22:22:10