Project1

标题: 请问在javascript中alert函数的运行机制是怎样的? [打印本页]

作者: 冷俊逸    时间: 2018-10-28 19:50
标题: 请问在javascript中alert函数的运行机制是怎样的?
如果在脚本中使用
  1. var xmlhttp=new XMLHttpRequest();
  2.    xmlhttp.onreadystatechange=function(){
  3.     $gameVariables.setValue(1, xmlhttp.responseText);}

  4. xmlhttp.open("GET","https://www.lengjunyi.work/rpgmaker/Get_Score.php/");
  5. xmlhttp.send();
复制代码


可以很轻松的得到网页内容,
可是如果加入一行alert,


  1. var xmlhttp=new XMLHttpRequest();
  2.    xmlhttp.onreadystatechange=function(){
  3.     $gameVariables.setValue(1, xmlhttp.responseText);}
  4.      alert(xmlhttp.responseText)
  5. xmlhttp.open("GET","https://www.lengjunyi.work/rpgmaker/Get_Score.php/");
  6. xmlhttp.send();
复制代码

就没有办法了。
请问为什么呢?

作者: 芯☆淡茹水    时间: 2018-10-29 08:27
没空解释为什么没作用。
但是你可以把 alert 放到 onreadystatechange 函数里试试。
作者: ekmomo    时间: 2018-10-29 14:22
本帖最后由 ekmomo 于 2018-10-29 14:35 编辑

一、网络请求分为同步(阻塞模式)和异步(非阻塞模式),简单的说:
同步:在获得网络请求结果前,解释器不能执行任何代码。
异步: 获得网络请求前解释器仍然可以执行接下来的代码。

默认使用异步方式的情况下,alert一般会在网络请求返回数据之前就执行。这个时候alert的内容显然是取不到值的。

二、解决方法:
你把alert 放到onreadystatechange 内部,并且使用readyState及status来约束onreadystatechange事件。
如:if (xmlhttp.readyState==4 && xmlhttp.status==200) alert(xxx);

或者更简单的在open()最后加上第三个参数false即可改为同步请求。
改为同步请求的同时你应当把alert()写在send()的后面,并且建议使用send(null)代替send(),这样更符合规范。

三、onreadystatechange 和同步请求的区别
onreadystatechange的本质是监听readyState 的一个事件,每当readyState发生改变的时候,它会执行自己函数体。
理论上它应当使用异步处理,其优势是其他的脚本依然保持会运行。
改为同步请求后,最直观的就是,如果网络状况不好,你的游戏会一直处于一个未响应的状态,直到结果返回。
同步请求也有自己的好处,因为它完全阻塞了代码的运行,所以最大程度上避免了不可预知的错误。
作者: 新夏夜之助    时间: 2018-11-7 15:02
我更好奇为什么alert怎么会让游戏跳出全屏




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1