0

这就是我想要做的:

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

如果值未定义,我正在尝试在 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]);
    }

}
4

3 回答 3

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表示它已完成并且数据在那里(您的成功检查)之后会发生什么是同步的。
等待是异步部分。
一旦交付,一切(包括支票内的东西)都会回到程序上。

于 2013-03-27T20:55:51.243 回答
0

只需使用带有成功/完成回调的jQuerygetJSON 。

于 2013-03-27T20:43:27.857 回答
0

您可以对 XMLHttpRequest 使用同步调用而不是异步调用。但是,如果您的用户需要在您等待响应时与网页交互,这可能不是最佳选择。

...
req.open("GET", url, false);
request.send(null);
于 2013-03-27T20:53:13.200 回答