Подтвердить что ты не робот

Невозможно внезапно изменить XMLHttpRequest.responseType?

Я использую синхронный XMLHttpRequest с responseType, установленным на "arraybuffer", довольно долго, чтобы загрузить двоичный файл и ждать, пока он не будет загружен. Сегодня я получил эту ошибку: "Die Verwendung des responseType-Attributes von XMLHttpRequest подключиться к модулю im window-Kontekt nicht mehr unterstützt". что примерно соответствует "Использование responseType для XMLHttpRequest в синхронном режиме в window-context (?) Больше не поддерживается".

Кто-нибудь знает, как это исправить? Я действительно не хочу использовать асинхронный запрос для чего-то подобного.

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

Работает отлично в хроме.

4b9b3361

Ответ 1

Это правильное поведение, определенное в Спецификация XMLHttpRequest:

При установке: выдает исключение "InvalidAccessError", если синхронныефлаг, и есть связанный XMLHttpRequest документ.

Свойство responseType не может быть установлено, если XMLHttpRequest не является асинхронным, то есть синхронным. Установка третьего параметра open на false приводит к тому, что запрос синхронный.

Ответ 2

Обход

Для случайного читателя, если вам все еще нужно синхронное поведение, вы можете загрузить свое содержимое в виде строки, а затем преобразовать его в байтовые данные.

NOTA:
Это обходное решение предполагает, что исходный текст request.response является текстом ASCII.
Если это предположение не соответствует вашему конкретному варианту использования, см. jBinary.

Я конвертирую его в 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;
}

Подробнее чтение

Ссылки