我有一个JavaScript函数,它从包含JSON的文本文件中读取一些数据。理想情况下,我想将所有JSON数据传递给我的封装函数中的私有变量,这样如果我需要再次读取数据,则可以使用该变量。
每次我需要进行某些检查时,我都不想阅读文本文件。对我来说,这听起来并不适合表现。
这是我的代码:
function someObj() {
var siteDataSet = null;
this.Init = function () {
populateData();
}
this.GetPageData = function () {
var props = new Array();
props[0] = siteDataSet.pagetitle;
props[1] = siteDataSet.week_no;
props[2] = siteDataSet.intro_text;
return props;
}
function populateData() {
$.ajax({
type: "GET",
url: "data.txt",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: "",
success: function (result) {
siteDataSet = result;
},
error: function () { },
complete: function () { }
});
}
}
$(document).ready(function () {
o_obj = new someObj();
o_obj.Init();
var t = o_obj.GetPageData();
});
如您所见,我正在调用Init()
使用jQuery Ajax将所有JSON传递给名为siteDataSet
的变量。当我调用GetPageData()
时,如果不是这种情况,则siteDataSet变量为null。
我是否正以一种完全荒谬的方式接近我想要实现的目标?
答案 0 :(得分:1)
这可能是因为您的ajax调用是异步发生的,并且在您尝试访问变量时尚未完成。通常情况下,在这种情况下,最好的办法是使用promise,它会告诉您的代码期望结果,因为它尚未设置。
有几个库提供了一个实现,例如:https://github.com/promises-aplus/promises-spec
作为替代方案,可以创建一个您希望在完成时调用的方法,该方法将包含您希望执行的所有代码,然后将其传入。例如:
function afterRetrieved(o_obj) {
var t = o_obj.GetPageData();
...
}
o_obj.Init(afterRetrieved);
将函数传递给您在检索数据后执行的Init
方法。这需要对您的实现进行一些更改,如下所示:
this.Init = function (fn) {
populateData(fn);
}
function populateData(fn) {
....
success: function (result) {
siteDataSet = result;
fn(this)
},
...
}
我想其中任何一个都可以解决你的问题。