Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数在调用之前放置警报时执行_Javascript_Json - Fatal编程技术网

Javascript 函数在调用之前放置警报时执行

Javascript 函数在调用之前放置警报时执行,javascript,json,Javascript,Json,首先,我为这个非常模糊的标题感到抱歉,但我不知道如何命名这个标题。所以,如果有人有更好的名字,请让我知道,我会编辑它 我做了一个计算器,用来计算拥有成本。值的输入来自用户或来自数据库的预设。预设值可以通过选择来选择,我使用onchange事件来更改输入数据 <select id="myID" onchange="getPreset(this.value)"> <option>Some options...</option> </select>

首先,我为这个非常模糊的标题感到抱歉,但我不知道如何命名这个标题。所以,如果有人有更好的名字,请让我知道,我会编辑它

我做了一个计算器,用来计算拥有成本。值的输入来自用户或来自数据库的预设。预设值可以通过选择来选择,我使用
onchange事件
来更改输入数据

<select id="myID" onchange="getPreset(this.value)">
  <option>Some options...</option>
</select>
这就是我的代码现在的样子,它可以正常工作。但是在我放置
calculate()之前
after
xmlhttp.send(),它没有按应有的方式工作。数据是在我选择了另一个选项后才计算出来的。例如:我第一次选择选项1-什么都没有发生。第二次选择选项2时,数据会像选择选项1一样进行计算

我知道它只是放置函数的错误位置,但我发现奇怪的是:如果我在调用函数之前放置警报,数据确实会被计算出来。因此,我的代码如下(因此您可以直观地看到):


因为我不知道这是为什么,我很想知道,我在这里问。我希望有人能帮我解释一下。

这是因为一切都是异步的。当警报弹出时,你(最终)会得到数据并正确计算。这就是它起作用的原因。如果连接速度非常慢,或者您在警报按钮上极快地单击“确定”,则可能会失败。这就是为什么你应该把它放在正确的位置:)

首先,如果选择了相同的选项(即重新选择第一个选项),你就不能执行
onchange
事件。我也尝试了
onblur
,得到了相同的结果。这一切都是关于
calculate
函数的放置。我发现奇怪的是,在调用错误位置的函数之前放置警报确实可以使其工作。在第二个示例中,调用的
calculate()
函数紧跟在AJAX调用之后,这是不同步的,因此它没有任何数据可供计算。因为
calculate()
是在AJAX调用完成之前执行的。也许第二次,它能够使用从第一次AJAX调用中收集的变量,从而计算它们;为返回的值提供更多时间。因为警报毕竟是一个控制流语句&停止执行流。我明白了。编辑:问题已回答。谢谢(:我完全忘记了AJAX是异步的,因为我对它缺乏经验。今天又学到了另一个教训!@RobbeVanWinckel有点好笑,你忘记了
“异步JavaScript和XML
”是异步的;)@Teemu Haha,我知道:当我看到AJAX代表什么时,我真的很惊讶。但是,嘿,愚蠢的错误是最常见的事情;)
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();
}
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();
}