0

我打算从 MYSQL 访问记录集并在 Javascript 中为日历组件处理它。因此,我使用 PHP 来获取记录并将其作为 json 记录数组转储到平面文件中。现在我尝试通过来自 javascript 的平面文件读取这个 json,但我遇到了一些问题。

var event_list;
$.getJSON("testFile.json", function(json) {
 alert("fetching");
 event_list= jQuery.extend(true, {}, json);
 alert(json);
 event_list=json;
 alert(JSON.stringify(event_list));   // This echo's me the data
 });
 alert(JSON.stringify(event_list));   // But this doesn't ???

我无法访问 getJSON() 例程范围之外的数据。

如果有人可以帮助我处理这个片段,那就太好了。

4

4 回答 4

2

您无法在回调之外访问获取的 JSON,因为它绑定到回调的范围,这可能是也可能不是异步的(在这种情况下是异步的)。

但是,您可以使用(aka )隐藏范围。DeferredPromises/A

jQuery 支持它,如下所示:

var request = $.getJSON("testFile.json");
request.done(function (data) {
    console.log(data);
});

所以现在request是一个包含你请求价值的承诺。

没有(好的)方法可以使数据在全局范围内同步可用。

于 2013-07-29T13:47:09.510 回答
1

因为是异步调用,不是同步的。在进行/返回 Ajax 调用之前,外部调用正在读取变量。您需要在回调中完成所有工作。

于 2013-07-29T13:46:45.860 回答
1

JQuery 使用 AJAX 加载 JSON 文件,而 AJAX 是异步的。

因此,发生的事情是getJSON在 JSON 文件仍在加载且尚未调用回调时首先调用之后的行。

这就是为什么event_list仍然未定义并且不返回任何数据的原因。

于 2013-07-29T13:49:06.423 回答
1

您可以使用async属性并将其设置为 FALSE 并将全局属性设置为 FALSE ,这将满足您的要求。

var data;
data= function () {
var tmp = null;
$.ajax({
    'async': false,
    'type': "POST",
    'global': false,
    'dataType': 'html',
    'url': "fetch_data.php",
    'data': { 'userid': "19"},
    'success': function (json) {
        tmp = json;
    }
});
return tmp;
}();

alert(data); //would give you the json data from PHP
于 2013-07-30T09:41:43.770 回答