输出文本或HTML时,这非常简单。下面是一个例子。
(但是,如果尝试输出JSON,则会遇到问题,我将进一步解决。)
PHP文件
header('Content-type: text/html; charset=utf-8');
function output($val)
{
echo $val;
flush();
ob_flush();
usleep(500000);
}
output('Begin... (counting to 10)');
for( $i = 0 ; $i < 10 ; $i++ )
{
output($i+1);
}
output('End...');
HTML文件
<!DOCTYPE>
<html>
<head>
<title>Flushed ajax test</title>
<meta charset="UTF-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
<script type="text/javascript">
var last_response_len = false;
$.ajax('./flushed-ajax.php', {
xhrFields: {
onprogress: function(e)
{
var this_response, response = e.currentTarget.response;
if(last_response_len === false)
{
this_response = response;
last_response_len = response.length;
}
else
{
this_response = response.substring(last_response_len);
last_response_len = response.length;
}
console.log(this_response);
}
}
})
.done(function(data)
{
console.log('Complete response = ' + data);
})
.fail(function(data)
{
console.log('Error: ', data);
});
console.log('Request Sent');
</script>
</body>
</html>
如果我需要使用JSON怎么办?
实际上不可能增量加载单个JSON对象(在完全加载之前),因为在拥有完整的对象之前,语法将始终无效。
但是,如果您的响应包含一个接一个的多个JSON对象,则可以一次加载一个,因为它们来自管道。
所以我通过以下方式调整了我的代码...
将PHP FILE第4行从更改echo $val;
为echo '{"name":"'.$val.'"};'
。这将输出一系列JSON对象。
将HTML FILE第24行从更改console.log(this_response);
为
this_response = JSON.parse(this_response);
console.log(this_response.name);
请注意,此基本代码假定进入浏览器的每个“块”都是有效的JSON对象。并非总是如此,因为您无法预测数据包将如何到达-您可能需要根据分号对字符串进行分割(或提供另一个分隔符)。
不要使用 application/json
难道不是为了改变你的头来application/json
-我做了这一点,它让我谷歌搜索3天。当响应类型application/json
为时,浏览器将等待,直到响应完成为止,就像完全完成一样。然后解析完整的响应以检查它是否为JSON。但是,我们的FULL响应是{...};{...};{...};
无效的JSON。该jqXHR.done
方法假定存在错误,因为无法将完整的响应解析为JSON。
如评论中所述,您可以使用以下命令在客户端禁用此检查:
$.ajax(..., {dataType: "text"})
希望有人觉得这有用。