1

我正在开发一个大量使用 Javascript 和 jQuery 的 Web 应用程序。

app我基本上在网页加载时创建一个对象并init()在页脚中调用该方法。

var app = new App();
app.init();

这些是该init()方法中的第一行代码。

// Load up the index
app.loadIndex();

alert(hashtag_index);

这些是该loadIndex()方法的几行。

hashtag_index  = [];

// Load the Topic JSON File
$.ajax({
    url : './data/index.json',

    type : 'GET',

    dataType : 'json',

    .
    .
    .

    // If the file loading is successful, save the index data
    success : function(data){

    var raw_index = [];

    $.each(data, function(key, val) {
        raw_index.push(data[key]);
    });

    // Add the hashtag object to global hashtag_index
    hashtag_index = raw_index;

    }
});

基本上,该loadIndex()方法所做的是加载一个大约 135kb 的 json 文件,并将数据作为对象加载到hashtag_index变量中。该hashtag_index变量是全局定义的,因此可以全局访问。

变量标签索引有 8 个不同的Object数组。但是在我尝试使用alert()该变量时,该变量尚未初始化。

alert()只返回一条空白消息。当我将此作为消息返回时:

alert(typeof(hashtag_index))

我得到undefined消息。

但是现在我确定该变量已加载,因为当我通过 Google Chrome 的控制台访问该变量时,我可以看到该变量已加载并且所有对象都在其中。

我解决问题的唯一方法是使用这行代码:

// Load up the index
app.loadIndex();

setTimeout( function(){

    alert(hashtag_index);

}, 500);

通过让 javascript 睡眠 500 毫秒,我已经给了足够的时间来加载它。

当然,我尝试了以下解决方案,但没有一个成功:

解决方案1:(进入无限循环)

// Load up the index
app.loadIndex();

while(!hashtag_index.length > 0) {

    continue;

};

alert(hashtag_index);

解决方案2:(进入无限循环)

// Load up the index
app.loadIndex();

while(hashtag_index.length == 0) {

    continue;

};

alert(hashtag_index);

解决方案3:(进入无限循环)

// Load up the index
app.loadIndex();

while(typeof hashtag_index === 'undefined') {

    continue;

};

alert(hashtag_index);

解决方案4:*(进入无限循环)

// Load up the index
app.loadIndex();


while(typeof hashtag_index == null) {

    continue;

};

alert(hashtag_index);

现在我的问题是如何在不引起任何未来问题的情况下绝对解决这个问题。我试图用以前的解决方案来解决这个问题,但它们都没有成功。

4

1 回答 1

6

您的app.loadIndex();方法使用 ajax,它是异步的。因此,alert(hashtag_index);在 ajax 调用完成并处理结果之前执行。

更改您的代码以使用回调,或者(我的偏好)app.loadIndex();返回一个承诺对象。

以下是实现承诺的方法:

var loadIndex = function() {
    var def = $.Deferred();

    $.ajax({
        //...
        success: function(result) {
            // do whatever
            def.resolve();
        }
        //...
    });   

    return def.promise();
};

……

// Load up the index
app.loadIndex().done(function() {
    alert(hashtag_index);
});

您可能需要扩展它以init()返回承诺或接受“完成”回调,具体取决于您的使用情况。

于 2013-08-23T20:26:02.343 回答