异步Ajax,具体是什么?

时间:2014-05-15 20:41:49

标签: javascript ajax asynchronous

这是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的调用会排队{{1}事件,在while循环返回之前无法处理,因此readystatechange无法更改,此程序只会挂起无限循环。

这是我的困惑:在查看了readyState方法(http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-open)的W3C规范之后,我认为调用open的算法规定了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。这对我来说很有意义,因为它所做的一切都是设置了一堆属性。

1 个答案:

答案 0 :(得分:0)

  

这种纠正是否正确?

是的,确实如此。已连接其规范的open方法会将readyState同步设置为OPEN。您可以通过在调用方法之前和之后记录属性值来测试它。第一个循环(使用readyState === UNSENT)将简单地破坏,甚至不进入正文,只有正确的循环才会产生无限循环。

  

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

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

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

send会将sent标志同步设置为true。没有“SENT”readystate,因此它不会触发事件。然而,它会触发loadstart progess事件(在它返回之前)。

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