Configuración De XMLHttpRequest.responseType prohibido todo lo de un repentina?

He estado usando sincrónico XMLHttpRequest con responseType ajustado a «arraybuffer» durante bastante tiempo para cargar un archivo binario y espere hasta que se cargue. Hoy en día, tengo este error:
«Die Verwendung des responseType-Atributos de von XMLHttpRequest wird im synchronen Modus ventana im-Kontekt nicht mehr unterstützt.»
que se traduce, a
«El uso de responseType para XMLHttpRequest en el modo de sincronización en la ventana de contexto(?) ya no se admite.»

¿Alguien sabe cómo solucionar este problema? Yo realmente no desea utilizar una solicitud asincrónica para algo como esto.

var xhr = new XMLHttpRequest();
xhr.open('GET', url, false);
xhr.responseType = 'arraybuffer';

Funciona bien en chrome.

  • Usted puede hacer binario síncrono XHR en la Web de los Trabajadores…
InformationsquelleAutor Markus | 2012-03-24

3 Kommentare

  1. 13

    Este es el comportamiento correcto, tal como se define en el Especificación de XMLHttpRequest:

    Cuando se establece: lanza un «InvalidAccessError» excepción si el sincrónico
    bandera
    se establece y es asociada a una XMLHttpRequest documento.

    La responseType propiedad no se puede establecer cuando el XMLHttpRequest no es asincrónica, es decir, sincrónico. Ajuste el tercer parámetro de open a false hace que la solicitud para ser sincrónico.

    • Suena raro para mí que algo como eso se supone que es una excepción. Pero gracias por señalarme a la especificación.
    • El punto es que usted no debería estar escribiendo código nuevo que utiliza la sincronización de XHR. Que se suprima totalmente rompería los sitios existentes, pero los navegadores y las especificaciones están tratando de restringir su uso en el nuevo código, de modo que el nuevo código, en realidad hace lo correcto y utiliza async XHR.
  2. 9

    Solución

    Para el lector casual, si usted todavía necesita el comportamiento sincrónico, usted puede descargar su contenido como una cadena de texto y, a continuación, convertir a un byte de datos

    NOTA:

    Esta solución supone que el original request.response es un ASCII de texto.

    Si esta suposición no se ajusta a su caso de uso específico por favor consulte jBinary.

    Puedo convertir a un ArrayBuffer.

    var request = new XMLHttpRequest();
    request.open('GET', url, false);
    request.send(null);
    
    var data;
    if (request.status === 200) {
        data = stringToArrayBuffer(request.response);
    } else {
        alert('Something bad happen!\n(' + request.status + ') ' + request.statusText);
    }
    
    //...
    
    function stringToArrayBuffer(str) {
        var buf = new ArrayBuffer(str.length);
        var bufView = new Uint8Array(buf);
    
        for (var i=0, strLen=str.length; i<strLen; i++) {
            bufView[i] = str.charCodeAt(i);
        }
    
        return buf;
    }

    Más a la lectura

    Referencias

    • Es allí una manera de recuperar el binario original (no ascii) datos binarios exactamente?
    • Para responder a su pregunta, he actualizado el post con una leer Más de la sección.
    • Soy sospechosa acerca de los binarios texto binario conversión no ceder el original bytes
    • La solución que aquí se presenta obras de solo con la suposición de que el original de bytes codificados en ASCII.
  3. 0

    Si tienes la suerte de tener el control sobre el punto de entrada de la página entera, considerar la posibilidad de envolver todo con un async la función y el uso de await para bloquear en la problemática de código asíncrono. Puede que no funcione con todos los casos de uso, aunque.

    (async function () {
        await problem_function_1();
        await problem_function_2();
        ... normal page logic pasted here ...
    })(); 

    Envoltura código asincrónico que no es una promesa con un Promise (por lo que esperan funciona como se esperaba), y llamar a la función de resolver de forma manual, en lo que constituye un «éxito de devolución de llamada». Hacer lo mismo para rechazar si es posible.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea