如何在JavaScript中處理未處理的XMLHttpRequest responseText的一部分,僅在onprogress/onreadystatechange處理程序中使用,而不使用XMLHttpRequest,prevDataLength,nextreadPos和inProgress(用於鎖定)的全局變量?如何處理沒有全局變量的未處理的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製品的Mozilla開發者中心部:
httpRequest.onreadystatechange = function() { alertContents(httpRequest); }; //1 (simultaneous request)
這在較大的代碼片段所用符號是
xhr.onreadystatechange = function() { handleResponse(xhr); }; //1 (simultaneous request)
但是,例如不告訴我如何處理其他全局變量:prevDataLength
和nextReadPos
。它們被用來決定是否有新的數據,並分別從服務器響應中提取完整的「句子」。
如何做到沒有全局變量?