Speichereffiziente Nachrichtenblockverarbeitung mit XMLHttpRequest
Ich habe einXMLHttpRequest
mit einerprogress
Event-Handler, der eine blockierte Seite anfordert, die fortlaufend Nachrichtenblöcke sendet. Wenn ich kein @ setresponseType
, Ich kann auf das @ zugreifresponse
Eigenschaft desXMLHttpRequest
in jedemprogress
event und verarbeite den zusätzlichen Nachrichtenblock. Das Problem dieses Ansatzes besteht darin, dass der Browser die gesamte Antwort im Speicher behalten muss und der Browser schließlich aufgrund dieser Speicherverschwendung abstürzt.
Also, ich habe versucht, einresponseType
vonarraybuffer
in der Hoffnung, dass ich den Puffer in Scheiben schneiden kann, um die vorherige übermäßige Speicherverschwendung zu verhindern. Leider ist dasprogress
Eventhandler kann das @ nicht mehr lesresponse
Eigenschaft desXMLHttpRequest
An diesem Punkt. Der Ereignisparameter desprogress
event enthält auch nicht den Puffer. Hier ist ein kurzes, in sich geschlossenes Beispiel für meinen Versuch, dies zu tun (dies ist geschrieben fürnode.js
):
var http = require('http');
// -- The server.
http.createServer(function(req, res) {
if (req.url === '/stream') return serverStream(res);
serverMain(res);
}).listen(3000);
// -- The server functions to send a HTML page with the client code, or a stream.
function serverMain(res) {
res.writeHead(200, {'Content-Type': 'text/html'});
res.write('<html><body>Hello World</body><script>');
res.end(client.toString() + ';client();</script></html>');
}
function serverStream(res) {
res.writeHead(200, {'Content-Type': 'text/html'});
setInterval(function() {
res.write('Hello World<br />\n');
}, 1000);
}
// -- The client code which runs in the browser.
function client() {
var xhr = new XMLHttpRequest();
xhr.addEventListener('progress', function() {
if (!xhr.response) return console.log('progress without response :-(');
console.log('progress: ' + xhr.response.size);
}, false);
xhr.open('GET', '/stream', true);
xhr.responseType = 'arraybuffer';
xhr.send();
}
Dasprogress
Event-Handler hat keinen Zugriff auf dieresponse
Ich wollte. Wie gehe ich speichereffizient mit den Nachrichtenblöcken im Browser um? Bitte nicht vorschlagen a WebSocket
. Ich möchte einen nicht nur zum Verarbeiten eines Nur-Lese-Streams von Nachrichtenabschnitten verwenden.