在JavaScript中加载配置异步,如何最好等待响应?

时间:2013-03-27 20:36:41

标签: javascript

这就是我想要做的事情:

  • 从远程服务器脚本请求JSON对象
  • 等待JavaScripts获取所有响应数据
  • 从响应对象
  • 打印一个值

我正在尝试在get config函数中使用setTimeout在1秒后调用自身,如果值未定义,当它不再未定义时使用该值执行某些操作。

或者似乎我可以创建一些循环几秒钟的方法,但我想避免这种情况,如果有更好的方法来完成我想要做的事情?我当前的代码似乎没有任何延迟,这会破坏我的运行时

感谢您的任何想法,继承代码:

function runApplication() {
    var initialiser = new Initialiser();
    var config = new Config();
    initialiser.fetchConfigurations(config);
    config.alertValue('setting1');
}

function Initialiser() {
    debug.log("Started");
}

Initialiser.prototype.fetchConfigurations = function(config) {
    var req = new XMLHttpRequest();
    var url = CONFIGURATION_SERVER_URL;
    req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
            var configObject = eval('(' + req.responseText + ')');
            config.setConfig(configObject);
        } else {
            debug.log("Downloading config data...please wait...");
        }
    }
    req.open("GET", url, true);
    req.send(null);
}
function Config() {
    this.config
}

Config.prototype.setConfig = function(configObject) {
    this.config = configObject;
}

Config.prototype.getValue = function(setting) {
    if(this.config === undefined) {
        setTimeout(this.getValue(setting), 1000);   
    } else {
        return this.config[setting];
    }
}


Config.prototype.alertValue = function(setting) {
    if(this.config === undefined) {
        setTimeout(this.alertValue(setting), 1000); 
    } else {
        alert(this.config[setting]);
    }

}

3 个答案:

答案 0 :(得分:1)

从我所看到的情况来看,你应该向.setConfig添加一个额外的步骤来处理下一个部分。

Config.prototype.setConfig = function (data) {
    this.config = data;
    this.doSomethingAfterTheDataExists();
};

有很多方法可以做到这一点...... ...编写一个主持人/观察者/发布 - 子实现很简单,并且可以在相对较少的行中完成,以获得好处......

编写Promise系统会更强大,但需要更多的工作(因为它就像上面的实现一样,增加了一个抽象层,为异步创建一个非常干净和简单的接口)。

.setConfig发布消息或触发另一个方法的另一种方法是在AJAX调用中.setConfig之后调用另一个方法。

xhr.onreadystatechange = function () {
    // .......
    config.setConfig(/* ... */);
    config.doSomethingAfterTheDataExists();
};

如果你正在进行多次AJAX调用,多次分配多个属性,并且你想等到每次调用都完成,那么你真的应该考虑实现一个Promise系统。
它将拯救你的理智,并且值得你想要湮灭的约60-100行。

如果你只是等待那一个回复回来,那么请记住,onreadystatechange表示它已经完成并且那里的数据(你的成功检查)是同步的,会发生什么。
等待是异步部分 一旦交付,所有内容(包括该检查内的内容)都会回归程序化。

答案 1 :(得分:0)

只需使用jQuerygetJSON 即可成功/完成回调。

答案 2 :(得分:0)

您可以使用同步调用而不是异步调用XMLHttpRequest。但如果您的用户需要在等待回复时与网页进行交互,则可能不是最佳选项。

...
req.open("GET", url, false);
request.send(null);