参考如下JScript代码:
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); xmlhttp.onreadystatechange = function () { WScript.Echo(xmlhttp.readyState); } xmlhttp.open("GET", "http://otnth.blogspot.com/", true); xmlhttp.send();
保存为js文件并用cscript或wscript执行,上述程序输出两次1后退出。如果把open挪到onreadystatechange前面,则只输出一次1后退出。
网上有很多人遇到移步方式下onreadystatechange只执行一次的问题,解决办法是把onreadystatechange写在open前面。但这里的问题似乎没有那么简单,感觉像是Windows Scripting Host脚本宿主未等待onreadystatechange变化就直接退出了,于是我写了如下代码求证:
var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); xmlhttp.open("GET", "http://otnth.blogspot.com/", true); xmlhttp.send(); while (true) { var n = xmlhttp.readyState; WScript.Echo(n); WScript.Sleep(100); if (n == 4) break; }
这次输出了N个1后,直接跳到4。所以,WSH是单线程的?
解决问题的办法也有,即使用WScript.Shell新开一个进程运行所需代码,并通过命令行传递参数:
if (WScript.Arguments.length>0) { var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); xmlhttp.open("GET", WScript.Arguments.item(0), false); xmlhttp.send(); WScript.Echo(xmlhttp.status + ' : ' + xmlhttp.statusText); } else { var wsh = new ActiveXObject("WScript.Shell"); var s = 'http://otnth.blogspot.com/'; wsh.run('wscript ' + WScript.scriptfullname + ' "' + s + '"'); }
能用,不过看起来很不舒服。另外需要注意的是,命令行参数有长度限制,还要留意引号的问题。
好吧,就这样了。
没有评论 :
发表评论