2013-10-01 29 views
1

以下是Lynda.com ajax课程中的一些代码。初学者AJAX课程 - 为什么我必须在函数中包装request.readyState?

var request = new XMLHttpRequest(); 

request.open('GET', 'data.txt'); 
request.onreadystatechange = function() 
{ 
    if (request.readyState===4) 
    { 
     console.log(request); 
     document.writeln(request.responseText); 
    } 
} 
request.send(); 

在过去的教训,我们检查request.status,这是不裹在一个函数的值,它工作得很好。但是现在,没有任何解释,request.readyState检查必须封装在上面看到的函数中,否则它将无法工作。这是怎么回事?

+1

一点也没有”礼貌真的需要一个解释。 request.onreadystatechange是被分配为包含条件的函数的对象(请求)的属性。简而言之,它定义了一个评估就绪状态变化的监听器。你读过XMLHttpRequest的文档吗? https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest –

+0

该函数被称为“处理程序”。只要触发onreadystatechange事件,它就会执行。 –

+0

@MatthewBlancarte由属性值引用的'Function'实例的正确术语是_event listener_。事件*处理程序*是调用事件侦听器的内部代码;有时这个术语被用作事件处理程序属性的同义词。 – PointedEars

回答

1

您分配给onreadystatechange的功能是一个事件处理程序。您在调用send()之前分配它,以便您不会错过请求引发事件的时间。如果您没有在事件处理程序中检查request.readyState,您会如何知道请求状态何时发生变化? send()方法默认情况下是非阻塞的。

另一种方法是检查readyState通过轮询某些任意间隔,这是绝对不希望的。

就像上面的评论者建议的那样,MDN doc很不错。

+1

由于ECMAScript实现的单线程性,send()方法调用在大多数情况下都被阻塞(如果不是全部的话)。你将这个事实与* request *异步处理*(“非阻塞”)的事实相混淆,这就是为什么'send()'方法调用很快返回的原因。 – PointedEars

+0

是的,说这个操作是异步的更准确。这允许发送调用返回而不会阻塞UI。 – nloko

1

工作,只是过早。当我了解这一点,我发现它有助于提醒的readyState值,以便我可以看发生了什么:

request.onreadystatechange = function() 
{ 
    alert(request.readyState); 
    ... 

这里是国家的名单,What do the different readystates in XMLHttpRequest mean, and how can I use them?

State Description 0  
The request is not initialized 1  
The request has been set up 2 
The request has been sent 3  
The request is in process 4 
The request is complete 
+0

谢谢先生 - 会试试这一切 - 在课堂上没有任何地方是我告诉过这是一个事件处理程序,并且2天的codechool和codeacademy从来没有像这样分解它! – dwilbank

+0

对,但正如你可能会看到的,某些事物的命名约定可能表明这是什么类型的对象属性。 onreadystatechange建议侦听器,它的示例用法几乎证实了这一点,不管它是否清楚地陈述过。很高兴我们可以帮忙。 –