在Encapsulated JavaScript函数中设置重用的私有变量

时间:2013-11-23 15:24:31

标签: javascript jquery json encapsulation

我有一个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。

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

1 个答案:

答案 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)
  },
  ...
}

我想其中任何一个都可以解决你的问题。