异步 XMLHttpRequest send() 在所有数据发送之前返回?

Posted

技术标签:

【中文标题】异步 XMLHttpRequest send() 在所有数据发送之前返回?【英文标题】:Asynchronous XMLHttpRequest send() returns before all data is sent? 【发布时间】:2015-12-01 02:16:41 【问题描述】:

当你做类似的事情时

xmlhttp.open("GET","ajax_info.txt",true);
xmlhttp.send();

send() 函数触发一个线程(或类似的东西)并发发送 HTTP 消息,或者它发送,然后只有在发送完所有数据后才返回?

【问题讨论】:

首先,Ajax 是一种技术,而 XHR 对象就像符合 API 的类型实例……当您向资源(uri、端点)“发送”请求时。客户端和服务器之间的连接(流)已建立并保持打开状态直到关闭。事物;在缓冲响应时,用户代理/客户端可以关闭流......这是暂定的......但是服务器将在写入所有数据时关闭流。我会找到规格的。 好的。更具体。我有一堆字节要通过套接字连接发送,对吧?如果在 send() 返回后执行 formfield.value = ""; 之类的操作,是否有丢失这些字节的风险? ? 您的意思是如果您在发送请求后修改下一条语句中的表单字段变量? javascript 是单线程的,它与 UI 共享相同的线程。当您调用 send 时,您将无法修改任何内容或执行任何行,直到它返回函数范围。这意味着在 XHR 对象上声明并由 xhr.send 方法/堆栈处理的数据在发送之前不能被修改。这有帮助吗? 好的,谢谢!这正是我想读的。 【参考方案1】:

xmlhttp.send() 永远不会返回,它是void,它只向服务器发出请求,您创建的xmlhttp 对象有一个名为onreadystatechange 的方法,当您的异步请求成功或失败时调用它,无论如何您的应用程序流没有损坏,它会继续运行。 https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

【讨论】:

哈哈,所以void函数不返回?他们不终止吗?哈哈哈。这个答案没有帮助。我询问了 send() 函数是否在所有 TCP 套接字内容完成之前终止。

以上是关于异步 XMLHttpRequest send() 在所有数据发送之前返回?的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest对象

Ajax与XMLHttpRequest随笔

异步处理XML异步数据——以原生的JavaScript与jQuery中的$.ajax()为例

为啥在xmlHttpRequest的open方法中使用参数true,却还是否异步啊?

第3章 第2节 Ajax

关于AJAX 第三篇