这是Trevor Burnham的Async JavaScript的示例:

var ajaxRequest = new XMLHttpRequest;
ajaxRequest.open('GET', url);
ajaxRequest.send(null);
while (ajaxRequest.readyState === XMLHttpRequest.UNSENT) {
// readyState can't change until the loop returns
};


这是我对示例打算讲的内容的理解:opensend调用是异步的,因此,尽管对open的调用将readystatechange事件排队,但是直到while循环返回时才可以处理它,因此readyState不能更改,该程序将挂在无限循环中。

这是我的困惑:在查看了open方法(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-open)的W3C规范之后,在我看来,调用open的算法规定应在步骤15触发readystatechange。上面的代码,循环将返回,因为在其执行时,readyState实际上是XMLHttpRequest.OPENED。实际上会使程序挂起的是:

var ajaxRequest = new XMLHttpRequest;
ajaxRequest.open('GET', url);
ajaxRequest.send(null);
while (ajaxRequest.readyState === XMLHttpRequest.OPENED) {
// readyState can't change until the loop returns
};


我的问题:此更正正确吗?另外,open还是异步的还是send?看来open必须是同步的,才能在原始示例中进入循环之前更改readyState。这对我来说很有意义,因为它所做的只是设置了许多属性。

最佳答案

此更正正确吗?


是的。已链接其规范的open方法确实将readyState设置为OPEN。您可以通过在调用方法之前和之后简单地记录属性值来进行测试。第一个循环(带有readyState === UNSENT)只会中断,甚至不会进入主体,只有更正的循环才会产生无限循环。


  另外,打开还是异步还是只是发送?


(假设异步请求)。两种方法都会立即返回。

open确实将readystate设置为OPENED。它还在此之后立即(立即返回)同步调度readystatechange事件。

send确实将sent标志设置为true。没有“已发送”就绪状态,因此不会为此触发事件。但是,它确实会触发loadstart proges事件(在返回之前)。

当异步接收到响应时,任务在事件循环中再次排队到switch the readystate;这些事件将是异步的。

关于javascript - 异步Ajax,发生了什么细节?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23688235/

10-16 08:58