XMLHttpRequest, prevDataLength, nextreadPos 및 inProgress (잠금 용)에 대한 전역 변수를 사용하지 않고 JavaScript 처리에서 아직 처리되지 않은 XMLHttpRequest responseText의 일부만 onprogress/onreadystatechange 처리기에서만 처리합니까?전역 변수없이 XMLHttpRequest 응답의 처리되지 않은 부분을 처리하는 방법은 무엇입니까?
문제는 다음과 같습니다. 현재 AJAX (XMLHttprequest의 responseText의 현재 값)를 사용하여 얻은 데이터의 현재 수신 된 부분을 기반으로 웹 페이지를 업데이트하고 싶습니다. 서버가 데이터를 보내 자마자 바로 페이지를 업데이트하고 싶습니다 (소위 HTTP streaming pattern). 업데이트 할 때 아직 처리되지 않은 responseText 부분 만 처리하려고합니다.
추가적인 복잡성은 responseText가 응답의 미완성 조각을 포함 할 수 있다는 것입니다. 하나는 터미네이터를 사용하여 (내가하는 것처럼) 쉽게 처리 할 수 있습니다. 그러면 완전한 응답을 쉽게 추출 할 수 있습니다.
현재 이전 호출이 작업 (새 데이터 처리)을 완료하지 않은 상태에서 처리기가 호출되는 문제를 방지하기 위해 전역 변수와 잠금을 사용합니다. 같은 내 코드 외모 (간체) 다음
function processData(unprocessed, nextReadPos) {
var lastLineEnd = unprocessed.lastIndexOf('\n');
if (lastLineEnd !== -1) {
var lines = unprocessed.substring(0, lastLineEnd).split('\n');
nextReadPos += lastLineEnd + 1 /* 1 == '\n'.length */;
processLines(lines);
} // end if
return nextReadPos;
}
function handleResponse() {
...
// here xhr.readyState === 4 && xhr.status === 200
// in case we were called before finished processing
if (inProgress) {
return;
} else {
inProgress = true;
}
// extract new whole (complete) lines, and process them
while (prevDataLength !== xhr.responseText.length) {
if (xhr.readyState === 4 &&
prevDataLength === xhr.responseText.length) {
break;
}
prevDataLength = xhr.responseText.length;
var unprocessed = xhr.responseText.substring(nextReadPos);
nextReadPos = processData(unprocessed, nextReadPos);
} // end while
...
inProgress = false;
}
...
xhr.onreadystatechange = handleResponse;
나는 그것이 예를 들어, 같은 매개 변수로 XMLHttpRequest 객체를 전달하여 작업을 완료하지 않았을 때 내가 다시 입력 핸들러에 대해 보호 할 수 간단 핸들러가있는 경우 의 경우 1 "3 단계 - 간단한 예"모질라 개발자 센터에서 AJAX/Getting_Started 문서의 :
코드의 큰 조각에 사용 된 표기법xhr.onreadystatechange = function() { handleResponse(xhr); }; //1 (simultaneous request)
입니다
httpRequest.onreadystatechange = function() { alertContents(httpRequest); }; //1 (simultaneous request)
그러나 예를하지 않는 다른 전역 변수와 관련하여 무엇을 할 지 말해주십시오 : prevDataLength
및 nextReadPos
. 이들은 새로운 데이터가 있는지 결정하고 서버 응답으로부터 완전한 '문장'을 추출하는 데 사용됩니다.
글로벌 변수없이 어떻게 할 수 있습니까?