设置私有变量以便在封装的JavaScript函数中重用

设置私有变量以便在封装的JavaScript函数中重用,javascript,jquery,json,encapsulation,Javascript,Jquery,Json,Encapsulation,我有一个JavaScript函数,它从包含JSON的文本文件中读取一些数据。理想情况下,我希望将所有JSON数据传递给封装函数中的私有变量,这样,如果需要再次读取数据,就可以使用该变量 我不想每次需要进行某些检查时都在阅读文本文件。对我来说,这听上去对性能不好 这是我的密码: function someObj() { var siteDataSet = null; this.Init = function () { populateData(); }

我有一个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,但实际情况并非如此


我是否正在以一种完全荒谬的方式接近我试图实现的目标?

这可能是因为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确实代表异步。最大的问题是性能。通过阻塞直到完成,脚本将一直挂起,直到远程服务器完成其处理。通常,延迟不是什么大问题,但大量处理、连接速度慢、负载高或其他因素会使请求花费比预期更长的时间。回调方法允许用户在处理请求时继续使用站点。最后,您必须确定用户的最佳体验是什么。