这是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
};
这是我对示例打算讲的内容的理解:
open
和send
调用是异步的,因此,尽管对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/