这就是我想要做的事情:
我正在尝试在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]);
}
}
答案 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)
答案 2 :(得分:0)
您可以使用同步调用而不是异步调用XMLHttpRequest。但如果您的用户需要在等待回复时与网页进行交互,则可能不是最佳选项。
...
req.open("GET", url, false);
request.send(null);