Konvertieren von Arraybuffer in String: Maximale Größe des Call-Stacks überschritten
Lesezeit: 2 Minuten
Sicher Atta
Das ist mein Code.
var xhr = new XMLHttpRequest();
xhr.open('GET',window.location.href, true);
xhr.responseType = "arraybuffer";
xhr.onload = function(event) {
debugger;
console.log(" coverting array buffer to string ");
alert(String.fromCharCode.apply(null, new Uint8Array(this.response)));
};
xhr.send();
Diese Anfrage wird an eine PDF-URL gestellt, die etwa 3 MB groß ist. Ich habe ein paar Threads mit dem gleichen Fehler gelesen, Maximale Call-Stack-Größe überschritten, der mir sagt, dass es einen rekursiven Aufruf geben muss, aber ich sehe hier keinen rekursiven Aufruf. Kann jemand helfen?
Geht diese Anfrage auf dieselbe Seite? Verwenden von GET on window.location.href?
Wenn Sie dieselbe Seite mit demselben Skript aufrufen, warum wundern Sie sich dann, dass es zu viele Rekursionen gibt? Versuchen Sie, eine andere Seite ohne Skript aufzurufen. Oder wenn Sie über xhr aufrufen, geben Sie das Skript nicht erneut aus oder fügen Sie Parameter hinzu, um den Aufruf zu unterscheiden.
– skobaljic
18. Juli 2016 um 10:27 Uhr
@skobaljic Dieses Skript wird in der Ladefunktion nicht ausgeführt. Ich lese gerade die PDF-Seitendaten.
– Suresh Atta
18. Juli 2016 um 10:29 Uhr
Haben Sie versucht, eine andere Seite oder ein anderes PDF zu laden?
– skobaljic
18. Juli 2016 um 10:30 Uhr
Ich hatte das gleiche Problem und habe schließlich diesen Code verwendet:
function _arrayBufferToBase64( buffer ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return window.btoa( binary );
}
könnte benutzen reduce stattdessen, aber das scheint notwendig zu sein
– Garr Godfrey
5. November 2020 um 18:24 Uhr
Dies sollte die akzeptierte Antwort sein. klappt wunderbar
– nächst
11. November 2020 um 12:42 Uhr
le_m
Der Fehler wird durch eine Begrenzung der Anzahl der Funktionsargumente verursacht. Siehe „RangeError: Maximale Call-Stack-Größe überschritten“ Warum?
Anstatt String.fromCharCode.apply()verwenden Sie zB a TextEncoder. Siehe Uint8Array zum String in Javascript
Hi. Wie benutzt man die TextEncoder in meinem Fall? ich habe das var base64 = btoa(String.fromCharCode.apply(null, new Uint8Array(blob)));
– Entw
6. März 2018 um 3:45 Uhr
Ich habe eine separate Frage eröffnet
– Entw
6. März 2018 um 5:01 Uhr
Für eine binäre Zeichenfolge TextEncoder ist nutzlos, es unterstützt nicht Latin1 (es verwendet Windows−1252), erhalten Sie das defekte Ergebnis. (new TextDecoder("ISO-8859-1").decode(new Uint8Array([148]))).charCodeAt(0); // 8221, sollte 148 sein
Thank you so much Anthony O, you saved my 10 days work.
small modification in my scenario is:
Angular 7 :
/** Convert Uint8Array to string */
private static arrayBufferToBase64( buffer: Uint8Array ) {
var binary = '';
var bytes = new Uint8Array( buffer );
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode( bytes[ i ] );
}
return binary;
}
14382100cookie-checkKonvertieren von Arraybuffer in String: Maximale Größe des Call-Stacks überschrittenyes
Geht diese Anfrage auf dieselbe Seite? Verwenden von GET on
window.location.href
?– skobaljic
18. Juli 2016 um 9:16 Uhr
@skobaljic Ja. Zum Beispiel ist die aktuelle Seite cs.columbia.edu/~lok/3101/lectures/02-corejava.pdf
– Suresh Atta
18. Juli 2016 um 9:19 Uhr
Wenn Sie dieselbe Seite mit demselben Skript aufrufen, warum wundern Sie sich dann, dass es zu viele Rekursionen gibt? Versuchen Sie, eine andere Seite ohne Skript aufzurufen. Oder wenn Sie über xhr aufrufen, geben Sie das Skript nicht erneut aus oder fügen Sie Parameter hinzu, um den Aufruf zu unterscheiden.
– skobaljic
18. Juli 2016 um 10:27 Uhr
@skobaljic Dieses Skript wird in der Ladefunktion nicht ausgeführt. Ich lese gerade die PDF-Seitendaten.
– Suresh Atta
18. Juli 2016 um 10:29 Uhr
Haben Sie versucht, eine andere Seite oder ein anderes PDF zu laden?
– skobaljic
18. Juli 2016 um 10:30 Uhr