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

XHR responseType "ms-stream" не работает на IE Mobile/Windows Phone 8.1

Я пытаюсь передать большое количество двоичных данных в JavaScript, получая доступ к данным до завершения загрузки. В большинстве основных браузеров я могу использовать трюк charset=x-user-defined, чтобы вручную получать необработанные байтовые данные во время события прогресса.

Однако в Internet Explorer этот трюк не работает, и вместо этого мне остается использовать метод VBArray(responseBody).toArray(), что очень медленно. Однако, поскольку мне нужно только поддерживать IE 11 и более поздние версии, я должен иметь возможность использовать IE MSStream для постепенного получения данных. Следующий код отлично работает на рабочем столе IE 11, но не на устройстве Lumia Windows Phone 8.1, на котором работает IE 11 mobile:

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'ms-stream';
xhr.onreadystatechange = function () {
    if (xhr.readyState === 3 && xhr.status === 200) {
        // reader is an MSStreamReader object
        reader.readAsArrayBuffer(xhr.response);
    }
};
xhr.send();

На устройстве Windows Phone readyState никогда не проходит 1, а status равно 0, что указывает на неизвестную ошибку, даже если никакая ошибка не возникает.

Кто-нибудь может понять, почему это не работает для меня или, возможно, решение проблемы?

4b9b3361

Ответ 1

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

Я думаю, что проблема заключается в том, что IE не получает readistate 3, потому что он не получает этого, пока не будет получен весь ответ.

Обходной путь для этой проблемы заключается в том, чтобы отправить две килобайтные "прелюдии", в верхней части потока ответов - мой тест просто отправляет 2 килобайта пробелов. После того, как начальный блок получен, событие onprogress запускается как каждый последующий блок принимается из сети.

Кроме того, вы пробовали это...

var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onreadystatechange = function () {
    if (xhr.status === 200) {
        var blob = this.response;
        reader.readAsArrayBuffer(blob);
    }
};
xhr.send();