【问题标题】:jQuery.Deferred exception (AJAX, JSON Array Object)jQuery.Deferred 异常(AJAX、JSON 数组对象)
【发布时间】:2018-01-04 17:13:31
【问题描述】:

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

这是我的 JSON:

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

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

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() 函数访问该信息时,我得到了异常。我的猜测是它试图在准备好之前访问信息(如果我尝试从浏览器的控制台访问它,它可以工作),这就是我添加延迟/承诺的原因。

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

谢谢!

【问题讨论】:

  • done(getDogs()) 立即调用getDogs,然后在getText() 完成时调用getDogs() 的结果。你可能想要done(getDogs)。
  • 避免使用deferred antipattern!而且你打电话给deferred.resolve() 太早了。

标签: jquery ajax asynchronous promise deferred


【解决方案1】:

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

确实如此。您调用 deferred.resolve 太早了,而且您立即调用 getDogs() 而不是将其传递给 then。

避免使用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);
}

【讨论】:

  • 成功了!但是您能解释一下 oJSON 是如何传递给 getDogs() 函数的吗?是不是因为它是 getText() 函数的最终结果并且被返回然后自动传递给 .done(getDogs);称呼?另外,如果我想开始根据我的 JSON 数据进行计算,我是否需要将 .done 方法串联在一起,或者我可以将下一个函数调用放在原始 getText() 调用下吗?
  • @JohnS 是的,是getText返回的promise的结果值。
  • @JohnS 是的,您需要链接更多的处理程序,但您应该使用then 而永远不要使用done
猜你喜欢
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 2018-01-01
相关资源
最近更新 更多