jQuery.Deferred异常(AJAX,JSON数组对象)

时间:2017-07-28 15:03:29

标签: jquery ajax asynchronous promise deferred

我的第一个函数通过jQuery AJAX请求获取JSON数组对象。 我的第二个函数试图访问该对象,但被一个" jQuery.Deferred异常命中:无法获取属性' 1'未定义或空引用..." (注意' 1'指我尝试访问oJSON [1] .name,如下面的代码所示。)

这是我的JSON:

[{"name":"Alpha", "numWalks":1},{"name":"Beta","numWalks":2}]

以下是我的代码:(注意:我必须将JSON保存为.txt文件并将其解析为JSON,因为我的SharePoint网站的设置方式。)

var oJSON;
$("document").ready(function() {
  getText().done(getDogs());
});

function getText() {
  var deferred = $.Deferred();
  $.get("dogWalksJSON.txt", function(returnedText) {
    oJSON = JSON.parse(returnedText);
  });
  deferred.resolve();
  return deferred.promise();
}

function getDogs() {
  console.log(oJSON[1].name);
}

如果我在getText()函数中使用console.log(oJSON [1] .name),它就可以工作。但是当我尝试从getDogs()函数访问该信息时,我得到了异常。我的猜测是,在它准备就绪之前尝试访问信息(如果我尝试从我的浏览器控制台访问它,它可以工作),这就是为什么我添加了延迟/承诺

有人对我如何解决此问题有任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:-1)

  

我的猜测是,它正准备在信息准备好之前访问

事实上。您过早地呼叫deferred.resolve,并且您正在立即呼叫getDogs(),而不是将其传递给当前。

避免deferred antipattern和全局oJSON变量,请使用

$("document").ready(function() {
  getText().then(getDogs  );
//                      ^^ no call
});

function getText() {
  return $.get("dogWalksJSON.txt")
  .then(function(returnedText) { // chain the promise
    return JSON.parse(returnedText); // fulfill it with the parsed object
  });
}

function getDogs(oJSON) {
  console.log(oJSON[1].name);
}