这是我第一次尝试执行延期功能而且我显然遇到了错误。我有点困惑,因为显然有几种方法可以做到这一点,但我尝试从最简单的工作中找到工作
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
部分我错了。
答案 0 :(得分: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
个对象,您的代码通过代理来添加冗余。
答案 1 :(得分:1)
这是正确的行为。在resolve
来电中,您传递了一个对象{data: data}
(让其称为对象A),因此它是一个具有data
的对象key,以及来自data
回调的$.getJSON(url).done
对象的值(让我们称之为对象B)。最后一个对象有一个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;
}