延迟getJSON的返回是未定义的

时间:2014-08-27 21:35:09

标签: jquery jquery-deferred

这是我第一次尝试执行延期功能而且我显然遇到了错误。我有点困惑,因为显然有几种方法可以做到这一点,但我尝试从最简单的工作中找到工作

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部分我错了。

2 个答案:

答案 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;
}