首先,我对这个非常模糊的标题感到抱歉,但我不知道如何命名这个标题。因此,如果有人有更好的名字,请告诉我,我会对其进行编辑。
我制作了某种计算器,计算所有权成本。值的输入来自用户或来自数据库的预设。可以使用select选择预设,然后使用onchange-event
更改输入数据。
<select id="myID" onchange="getPreset(this.value)">
<option>Some options...</option>
</select>
在getPreset()
函数中我做了一些事情+我调用了另一个函数,我用它来通过JSON从数据库中获取数据。
function getInfo(name){
var xmlhttp;
if(window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var info = JSON.parse(xmlhttp.responseText);
//process data
calculate();
}
}
xmlhttp.open("GET", "myphppage.php?name="+name, true);
xmlhttp.send();
}
这就是我的代码现在的样子,它可以正常工作。但是在calculate();
xmlhttp.send();
之后放置xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
var info = JSON.parse(xmlhttp.responseText);
//process data
}
}
xmlhttp.open("GET", "myphppage.php?name="+name, true);
xmlhttp.send();
alert("make it work.");
calculate();
}
之前,它没有按照应有的方式工作。仅在我选择其他选项后才计算数据。例如:我第一次选择选项1 - 没有任何反应。我第二次选择选项2 - 选择数据,就像选择选项1一样。
我知道放置这个函数只是错误的地方,但是我发现这很奇怪:如果我在调用函数之前发出警报,数据就会被计算出来。所以我的代码如下(所以你可以直观地看到它):
{{1}}
由于我不知道为什么会这样,而且我很想知道,我在这里问它。我希望有人可以帮我解释一下。
答案 0 :(得分:0)
这是因为一切都是异步的。当警报弹出时(最终)获取数据并正确计算。这就是它的原因。如果连接速度很慢或者您在警报按钮上单击“确定”非常快,则可能会失败。这就是为什么你应该把它放在正确的地方:))