首先,我查看了相关的 SO 问题,并没有找到合适的答案,所以这里是:
我一直在开发一个 HTML/Javascript 页面,该页面充当后端服务器的 UI。我在完成它方面取得了相当大的进步,同时在 AJAX(又名var xmlhttp = new XMLHttpRequest(); xmlhttp.open(type, action, false);
)中使用同步调用,但现在发现 Mozilla 显然不喜欢同步请求,因此弃用了它们的一些急需的功能。
引用https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest:
注意:从 Gecko 11.0 (Firefox 11.0 / Thunderbird 11.0 / SeaMonkey 2.8) 以及 WebKit build 528 开始,这些浏览器不再允许您在执行同步请求时使用 responseType 属性。尝试这样做会引发 NS_ERROR_DOM_INVALID_ACCESS_ERR 异常。此更改已提交给 W3C 进行标准化。
那太好了。我将需要有条件地更改响应类型,但它不起作用。现在我打算将 AJAX 异步请求包装在模拟同步性的东西中。
以下是我的代码使用的通用“发出网络请求”功能,我已经开始适应我的目的。不幸的是,它并没有像我希望的那样工作。
var webResponse = null;
function webCall(action, type, xmlBodyString) {
console.log("In webCall with " + type + ": " + action);
webResponse = null;
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function()
{
if (xmlhttp.readyState == 4)
{
if (xmlhttp.status == 200) {
webResponse = xmlhttp.responseXML;
} else {
var statusTxt = xmlhttp.statusText;
if (statusTxt == null || statusTxt.length == 0) {
statusTxt = "An Unknown Error Occurred";
}
throw "ERROR " + xmlhttp.status + ":" + statusTxt;
}
}
}
xmlhttp.open(type, action, true);
if (xmlBodyString == null) {
xmlhttp.send();
} else {
xmlhttp.setRequestHeader("Content-Type", "text/xml");
xmlhttp.send(xmlBodyString);
}
for (var i = 0; i < 20; i++) {
if (webResponse != null) {
break;
}
window.setTimeout(nop, 250);
}
if (webResponse == null) {
throw "Waited 5 seconds for a response, and didn't get one.";
}
console.log("Responding with " + webResponse);
return webResponse;
}
function nop() {
}
所以,我认为这很简单。创建一个全局变量(回想起来,它可能甚至不必是全局的,但现在,w/e),设置 onreadystatechange 以在它准备好后为其分配一个值,发出我的异步请求,等待最大值全局变量不为空的 5 秒,然后要么返回它,要么抛出错误。
问题是我的代码实际上并没有等待 5 秒。相反,它立即退出,声称它在这样做之前等待了 5 秒。
我做了一个小提琴,为了它的价值。它在那里也不起作用。 http://jsfiddle.net/Z29M5/
非常感谢任何帮助。