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

Set Private Variable for Reuse In Encapsulated JavaScript function

本文关键字:变量 用于 设置 封装 JavaScript 函数      更新时间:2023-09-26

我有一个JavaScript函数,它从包含JSON的文本文件中读取一些数据。理想情况下,我希望将所有JSON数据传递给encapulated函数中的一个私有变量,这样,如果需要再次读取数据,就可以使用该变量。

我不想每次需要进行某些检查时都在阅读文本文件。对我来说,这听起来不利于表演。

这是我的代码:

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()是为了使用jQueryAjax将所有JSON传递给一个名为siteDataSet的变量。当我调用GetPageData()时,siteDataSet变量为null,而不应该是这种情况。

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

这可能是因为您的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)
  },
  ...
}

我想这两种方式中的任何一种都应该解决你的问题。