在执行某些 ajax 操作时,此匿名回调函数何时运行
when does this anonymous callback function run when doing some ajax stuff?
我刚开始学习ajax,我只是无法理解示例中使用的匿名回调函数的概念。
function getData(dataSource, divID)
{
if(XMLHttpRequestObject) {
var obj = document.getElementById(divID);
XMLHttpRequestObject.open("GET", dataSource);
XMLHttpRequestObject.onreadystatechange = function()
{
if (XMLHttpRequestObject.readyState == 4 &&
XMLHttpRequestObject.status == 200) {
obj.innerHTML = XMLHttpRequestObject.responseText;
}
}
XMLHttpRequestObject.send(null);
}
}
匿名函数何时触发? JavaScript 会逐行读取此内容吗?
代码中,你是:
- 构建请求对象
- 为该对象分配回调
- 您发送请求
您分配给 XMLHttpRequestObject.onreadystatechange
的函数是匿名函数的示例,一旦readyState
更改,该函数就会被执行。 要进行粗略比较,就像向<select>
添加onchange
- 当值更改时,执行分配的匿名函数
匿名函数非常重要,其中一个函数使用它来定义一组"要做的事情",基本上是将"待办事项"列表交给另一个操作。 然后该操作将在需要时执行它,在本例中为 onreadystatechange
.
您的代码也是"异步操作"的示例。代码从上到下运行。回调只是"分配"的,因此不会执行。发送请求后,此时它不会等待响应。它就像一个后台操作,而其余的代码在它被执行之后。
一旦 readyState
的值发生变化,您刚刚分配给XMLHttpRequestObject.onreadystatechange
的函数就会被执行。 条件
XMLHttpRequestObject.readyState == 4 && XMLHttpRequestObject.status == 200
在该函数中,确定请求是否完成 (4) 和页面是否正常 (200)。 如果是这样,则响应可供使用。
Javascript中的函数是第一类对象,这意味着它们可以像任何其他变量一样传递。
该行
XMLHttpRequestObject.onreadystatechange = function() { }
将XMLHttpRequestObject
对象的 onreadystatechange
属性设置为该函数。如果您查看文档,您将看到此函数"每当 readyState
属性更改时都会调用"
当您设置XMLHttpRequestObject.onreadystatechange
时,您实际上是在更改类的方法,因此该函数不会在设置时执行,而是在稍后更改就绪状态时执行......
每次更改 readyState 时都会调用该函数,因此如果您在那里设置了一个计数器
var counter = 0;
XMLHttpRequestObject.onreadystatechange = function() { console.log(counter++) };
并检查控制台.log您将看到调用的次数与 OnreadyStateChange 一样多(这是一个触发 anonymouse 函数的事件)
虽然我读到你只是在学习javascript和AJAX,但我建议看看一些跨浏览器支持的东西,如jQuery,Zepto和其他...
从这里引用:
如果 XMLHttpRequest 对象的 open 方法使用 异步请求的第三个参数设置为 true,即 将自动调用 onreadystatechange 事件侦听器 以下更改 readyState 属性的每个操作 XMLHttpRequest 对象。
这意味着每当 readystate 属性更改时都会调用回调。由于调用是异步的,因此您无法知道何时会发生这种情况(因为它基本上取决于服务器的响应时间)。
好的,我将带您逐步解释 AJAX:
var request = new XMLHttpRequest; // create a new HTTP Request
request.open("GET", "/resource.txt"); // set the method as GET and specify the URL to request for
request.onreadystatechange = handle; // attach a handler which is called when the ready state of the request changes
request.send(); // dispatch the HTTP Request
/*
function to call when the ready state of the request changes
*/
function handle() {
if (request.readyState === 4 && request.status === 200) {
alert(request.responseText); // if the ready state is 4 (complete) and the server sends a status of 200 (OK) then alert the contents of resource.txt which is stored in request.responseText
}
}
现在要了解:
- AJAX 用于与服务器通信。
- 要与服务器通信,我们需要向其发送消息(
XMLHttpRequest
)。 - 在消息中,我们指定消息使用的方法(
GET
、POST
等)。您可以在此处阅读有关它的更多信息。 - 我们需要指定消息的目标地址(URL)。在这种情况下,它是
/resource.txt
. - 现在我们已经写好了这封信,我们实际上寄出了它。就像把它放进邮箱一样。
- 现在是邮局(在本例中为浏览器)传递邮件的问题。
- 但是,如果我们想知道邮件的状态(
readyState
),我们需要告诉浏览器在更改时通知我们。 - 要收到通知,我们只需添加一个函数即可
onreadystatechange
.现在,每当消息readyState
发生变化时,浏览器将自动调用该函数。
以下是消息的就绪状态:
- 0(未初始化)- 请求未初始化
- 1(正在加载)- 服务器连接已建立
- 2(已加载)- 收到请求
- 3(交互式)- 处理请求
- 4(完成)- 请求完成,响应准备就绪
好了,现在来了解发生了什么:
- 当我们写一条消息但没有发送它时,
readyState
0
因为请求没有初始化(即它没有被发送或放入邮箱)。
将邮件 - 放入邮箱后,浏览器会尝试将邮件发送到服务器。此时,
readyState
变得1
。 - 当整个消息被传递时,
readyState
变得2
。 - 然后,服务器写入对消息的回复,并在消息正文中放置您请求的内容。当服务器写入回复时,
readyState
变为3
。 - 最后,当回复到达我们时,
readyState
更改为4
.
每次readyState
更改时,浏览器都会触发您提供的onreadystatechange
函数,以通知您发生了事件。简单吧?
总之,如果您想了解有关状态代码的更多信息,请转到此页面。
- JavaScript回调函数
- 如何在回调函数中执行流
- 回调函数中传递参数的困难(Google Map API Markers)
- 如何正确地将参数传递给RequireJS回调函数
- 回调函数在python代码中离线
- 从AJAX回调函数中分离数据
- 赋值后的回调函数
- 如何在javascript回调函数中返回多个变量
- 函数表达式,返回回调函数
- 等待回调函数执行
- JavaScript回调函数和Google Feed API
- 如何从ajax成功回调函数中读取javascript变量
- 正在保存JavaScript内部回调函数中的值
- 有没有什么方法可以停止Jquery中的animate(也可以停止完整的回调函数)
- 如何在javascript中添加带有回调函数的按钮点击事件作为window.conf
- 在Golang回调函数中启用CORS
- 在初始函数完成之前调用回调函数
- jQuery Mobile:如何在$.Mobile.changePage之前运行回调函数
- 即使使用回调函数也无法返回值
- 为什么prototypjs观察到回调函数有绑定