在$.getJSON函数中设置的变量只能在函数内部访问。

9 浏览
0 Comments

在$.getJSON函数中设置的变量只能在函数内部访问。

这可能更多是一个范围问题。我试图在$.getJSON函数内部设置一个JSON对象,但我需要能够在回调之外使用该对象。

var jsonIssues = {};  // 声明json变量
$.getJSON("url", function(data) {
    jsonIssues = data.Issues;
});
// jsonIssues在这里不可访问

在另一个帖子中有类似的问题,共识是我需要在回调函数内部处理JSON对象,不能在其他任何地方访问它。真的没有办法我能继续在$.getJSON回调之外访问/操作那个JSON对象吗?返回变量或设置为全局变量呢?

我会非常感谢任何帮助。这看起来不对劲...

更新:

尝试将$.ajax()的async设置为false,然后运行相同的代码,但没有成功。我尝试的代码如下:

var jsonIssues = {};  // 声明json变量
$.ajax({ async: false });
$.getJSON("url", function(data) {
    jsonIssues = data.Issues;
});
// jsonIssues仍然无法在这里访问

还有一些回答说全局变量应该可以正常工作。我应该澄清一下,所有这些代码都在$(document).ready(function() {内。为了设置一个全局变量,我应该在document.ready之前声明它吗?像这样:

var jsonIssues = {};
$(document).ready(function() {
  var jsonIssues = {};  // 声明json变量
  $.getJSON("url", function(data) {
      jsonIssues = data.Issues;
  });
  //现在能访问?
}

我原本认为在document.ready内部声明的变量应该可以在document.ready的任何部分以及$.getJSON回调函数等子函数中“全局”访问和修改。也许我需要研究一下JavaScript变量作用域,但似乎没有简单的方法来实现我的目标。感谢所有的回答。

更新 #2:

根据下面回答中给出的评论,我使用了$.ajax而不是$.getJSON,并实现了我想要的结果。代码如下:

var jsonIssues = {};
    $.ajax({
        url: "url",
        async: false,
        dataType: 'json',
        success: function(data) {
            jsonIssues = data.Issues;
        }
    });
    // jsonIssues在这里可访问——很好!!

对我的答案进行了几点跟进评论(我很感激)。我这样做的目的是最初加载一个包含用户可以从中删除并保存的问题列表的JSON对象。但这是通过页面上的后续交互完成的,我无法预见用户在回调中会对JSON对象做什么。因此,一旦回调完成,就需要使其可访问。有人看到我的逻辑有什么问题吗?真的,因为可能有我没看到的东西...

此外,我正在阅读jQuery的.ajax()文档,并且它说将async设置为false“同步加载数据。在请求处于活动状态时阻塞浏览器。当需要同步时,最好通过其他方式阻止用户交互。”

有人知道在进行此操作时应该如何阻止用户交互吗?为什么它是如此关键?再次感谢所有的回答。

0