According to MDN ,XMLHttpRequest
readyState
事件触发 5 个事件,如下所列。
0 UNSENT open()has not been called yet.
1 OPENED send()has not been called yet.
2 HEADERS_RECEIVED send() has been called, and headers and status are available.
3 LOADING Downloading; responseText holds partial data.
4 DONE The operation is complete.
这似乎表明 HEADERS_RECEIVED
在整个文件下载之前就可用,尤其是在长时间传输期间。但是,在我的测试中,虽然事件确实按此顺序触发,但 HEADERS_RECEIVED
和 LOADING
几乎与 DONE
事件同时触发.
这是一个说明我的问题的基本示例。 OPENED
事件会立即触发,但 HEADERS_RECEIVED
、LOADING
和 DONE
都会等待 5 秒。我在 Firefox 和 Chrome 中的本地 Apache 2.4 服务器上使用 PHP 5.5 运行了此测试。
JavaScript:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
console.log("readyState:", xmlhttp.readyState);
};
xmlhttp.open("GET", "handler.php", true);
xmlhttp.send();
handler.php:
<?php
header( 'Content-Type: text/plain' );
echo "start\n";
sleep( 5 );
echo "end\n";
似乎在内容之前获取 header 的唯一方法是首先发出 HEAD
请求,然后发出完整请求。这是预期的行为还是我错过了什么?
更新:
使用通过慢速网络共享符号链接(symbolic link)的 1GB 文件,或输出大量输出的 PHP 文件(如下例)确实会更快地触发 HEADERS_RECEIVED
。不过这似乎有些不靠谱。我尝试过使用 PHP 的 flush
在 sleep
之前起作用,但没有帮助。
<?php
header( 'Content-Type: text/plain' );
echo "start\n";
$i = 10000000;
while( $i-- ){
echo "1\n";
}
echo "end\n";
有没有一种方法可以可靠地发送 header ,而无需等待内容发送?
最佳答案
至少在您的示例中,我猜测 PHP 在 sleep 之后才真正刷新缓冲区(从而发送 header ),但我不确定如果您这样做,这是否可以解释这种行为在使用实际文件下载时遇到过这种情况。
关于javascript - XMLHttpRequest ReadyState HEADERS_RECEIVED 等待下载整个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26685554/