从ajax请求插入后,JSON节点返回'undefined'

时间:2014-10-30 12:56:56

标签: javascript jquery ajax json

我有一个jQuery插件,可以通过ajax调用加载json数据 - 返回的数据被插入到现有对象中。

当我尝试引用新插入的节点时,我得到一个“未定义” - 虽然数据在控制台中看起来很好。

如果我手动定义数据,那么我可以很好地访问它 - 即使结构是相同的。

数据加载到init事件上(.then()中会有多个函数调用,但我只是显示失败的初始调用 - 每个调用都会引用相同的_t.criteria.base。 x其中x是插入的json):

 var _t = this;

_t.init = function() {
        _s = $.extend({}, defaults, options);
        $.when( 
            loadDefaultCriteria() 
        ).then(
            renderCommunities
        );
    }

这会加载数据:

_t.criteria = {
        base: {},
        current: {},
        picks:{}
    }; 

var loadDefaultCriteria = function() {
        $.getJSON
        (
            '/path/to/script.php',
            {
                action: 'loadDefaultCriteria',
            })
            .done( function( data ){
                _t.criteria.base = data;
            })
            .fail( function( jqxhr, textStatus, error ) {
                var err = textStatus + ", " + error;
                console.log( "Request Failed: " + err );
            });
        }

这是失败的代码(调试日志仍然存在)

var renderCommunities = function(){
        console.log(_t.criteria);
        var c = $(_s.containers.communities);
        var i = _t.criteria.base.communities;

        console.log(i);

        c.empty();

        c.append('<ul>');

        $.each( i, function( idx, _i ) {
                console.log(_i);
            });

    }

console.log(_t.criteria)输出(我只显示基础对象的展开树):

Object {base: Object, current: Object, picks: Object}
    base: Object
        communities: Object
             subscribed: Array[2]
                0: Object
                1: Object
             unsubscribed: Array[1]
                0: Object
   current: Object
   picks: Object

无论我尝试在哪个对象并在下面引用它们都返回'undefined',所以在上面的代码中,console.log(_t.base.communities)将返回undefined。

如何将JSON数据/节点的子集插入现有对象然后访问它们?

1 个答案:

答案 0 :(得分:0)

$.when期望Deferred对象作为其参数。现在,loadDefaultCriteria不会返回任何内容,因此$.whenundefined作为其参数。相反,loadDefaultCriteria必须return$.getJSON(...)调用创建的延迟对象:

var loadDefaultCriteria = function() {
    return $.getJSON( ... );
}

您的renderCommunities来电已在getJSON来电完成之前发生。您的console.log调用显示更新对象的原因是因为您在强制$.getJSON调用后console.log always shows the object as it exists at inspection time检查了已记录的对象。事件的顺序是:

  1. getJSON
  2. 中发起loadDefaultCriteria来电
  3. 在对象更新
  4. 之前立即运行renderCommunities
  5. 在控制台输出中显示未展开的对象
  6. $.getJSON解析并更新对象
  7. 稍后,在控制台输出中展开对象以查看当前存在的对象