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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage