Невозможно внезапно изменить 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';
Работает отлично в хроме.
Ответы
Ответ 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;
}
Подробнее чтение
Ссылки