Установка XMLHttpRequest.responseType запрещена внезапно? - PullRequest
18 голосов
/ 25 марта 2012

Я уже довольно давно использую синхронный XMLHttpRequest со значением responseType, установленным в "arraybuffer", чтобы загрузить двоичный файл и дождаться его загрузки.Сегодня я получил эту ошибку: «Определить ответные атрибуты типа XMLHttpRequest с помощью режима« Модификация окна »-« Нет данных ».»что примерно переводится как «Использование responseType для XMLHttpRequest в синхронном режиме в контексте окна (?) больше не поддерживается».

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

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

Прекрасно работает в хром.

Ответы [ 3 ]

13 голосов
/ 25 марта 2012

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

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

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

.
8 голосов
/ 25 ноября 2014

Обход

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

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;
}

Подробнее

Ссылки

0 голосов
/ 30 декабря 2018

Если вам повезло иметь контроль над точкой входа всей страницы, попробуйте обернуть все это функцией async и использовать await для блокировки проблемного асинхронного кода. Может работать не во всех случаях использования.

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

Оберните асинхронный код, который не является обещанием, в Promise (чтобы ожидание работало должным образом) и вызовите функцию разрешения вручную в любом случае, который представляет собой «обратный вызов успеха». Сделайте то же самое для отказа, если это возможно.

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