设置私有变量以便在封装的JavaScript函数中重用
我有一个JavaScript函数,它从包含JSON的文本文件中读取一些数据。理想情况下,我希望将所有JSON数据传递给封装函数中的私有变量,这样,如果需要再次读取数据,就可以使用该变量 我不想每次需要进行某些检查时都在阅读文本文件。对我来说,这听上去对性能不好 这是我的密码:设置私有变量以便在封装的JavaScript函数中重用,javascript,jquery,json,encapsulation,Javascript,Jquery,Json,Encapsulation,我有一个JavaScript函数,它从包含JSON的文本文件中读取一些数据。理想情况下,我希望将所有JSON数据传递给封装函数中的私有变量,这样,如果需要再次读取数据,就可以使用该变量 我不想每次需要进行某些检查时都在阅读文本文件。对我来说,这听上去对性能不好 这是我的密码: function someObj() { var siteDataSet = null; this.Init = function () { populateData(); }
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,但实际情况并非如此
我是否正在以一种完全荒谬的方式接近我试图实现的目标?这可能是因为ajax调用是异步进行的,并且在尝试访问变量时尚未完成。通常,在这样的情况下,最好的选择是使用一个命令,该命令将告诉代码预期结果,因为它尚未设置 有几个库提供了实现,例如: 作为替代方案,您可以创建一个希望在完成时调用的方法,该方法将包含您希望执行的所有代码,然后将其传入。比如:
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)
},
...
}
我认为这两种方法都可以解决您的问题。您完全正确地认为异步ajax调用是一个问题。我成功地实现了这个解决方案,但我还注意到,通过在ajax调用中设置“async:false”属性,似乎可以解决我的问题。与您的解决方案相比,使用“async:false”是一种不好的做法吗?这本身并不是一种不好的做法,但请记住AJAX中的A确实代表异步。最大的问题是性能。通过阻塞直到完成,脚本将一直挂起,直到远程服务器完成其处理。通常,延迟不是什么大问题,但大量处理、连接速度慢、负载高或其他因素会使请求花费比预期更长的时间。回调方法允许用户在处理请求时继续使用站点。最后,您必须确定用户的最佳体验是什么。