이것은 텍스트 나 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"})
어떤 사람들이 이것이 유용하다고 생각하기를 바랍니다.