2015-02-13 7 views
1

Моя компания разработала встраиваемый javascript видеоплеер. Часть процесса начальной загрузки включает использование XMLHttpRequest для извлечения ресурса с нашего сервера. Это запрос на перекрестный поиск, потому что наш видеопроигрыватель встроен на сайты других людей с помощью тега скрипта. У нас есть наши заголовки CORS настроены правильно, и он работает в Chrome, Firefox, Safari, iOS, Android и других. Это также работает для меня, когда я тестирую в IE 11 и 10.IE 11 XHR Failures

Однако из наших данных аналитики мы видим, что объект xhr вызывает событие error около 10% времени в IE 11. Я не смог чтобы воспроизвести проблему самостоятельно.

Может ли кто-нибудь подумать о каких-либо причинах, почему это может произойти? Лучшая теория, которую я имею, - это какие-то корпоративные настройки безопасности IE, которые блокируют наш запрос кросс-происхождения. Но это просто дикие предположения.

Неужели кто-то еще когда-либо испытывал что-то подобное и нашел причину?

Вот код, который я написал для запросов. Я не верю, что делаю что-то неправильно.

function makeRequest(config) { 
 
    var xhr = new window.XMLHttpRequest(); 
 
    var deferred = q.defer(); 
 
    var url; 
 

 
    function setHeaders(headers) { 
 
    var header; 
 

 
    for (header in headers) { 
 
     xhr.setRequestHeader(header, headers[header]); 
 
    } 
 
    } 
 

 
    // toQueryParams() converts an object to URL query params 
 
    url = config.url + toQueryParams(config.params); 
 

 
    /* 
 
    * This function gets called when the XHR is "loaded". It then fulfills or rejects 
 
    * the promise based on the HTTP status code of the response. 
 
    */ 
 
    function handleResponse() { 
 
    var response = { 
 
     status: xhr.status, 
 
     data: (function() { 
 
     try { 
 
      return JSON.parse(xhr.responseText); 
 
     } catch(e) { 
 
      return xhr.responseText; 
 
     } 
 
     }()), 
 
     headers: function() { 
 
     return xhr.getAllResponseHeaders(); 
 
     } 
 
    }; 
 
    var status = response.status, 
 
    var success = !(status >= 400 && status < 600); 
 

 
    deferred[success ? 'resolve' : 'reject'](response); 
 
    } 
 

 
    /* 
 
    * This function gets called when the XHR emits an "error". 
 
    * 
 
    * There is code elsewhere that sends these errors to our Google Analytics 
 
    * account. This is how we know about the IE 11 XHR errors even though I 
 
    * can't reproduce them. 
 
    */ 
 
    function handleError() { 
 
    deferred.reject({ 
 
     status: null, 
 
     data: new Error('The XHR request to [' + url + '] has failed...'), 
 
     headers: function() { 
 
     return null; 
 
     } 
 
    }); 
 
    } 
 

 
    xhr.onload = handleResponse; 
 
    xhr.onerror = handleError; 
 

 
    xhr.open(config.method, url, true); 
 

 
    xhr.responseType = config.responseType || ''; 
 
    setHeaders(config.headers); 
 
    xhr.timeout = config.timeout || 0; 
 

 
    xhr.send(config.data); 
 

 
    return deferred.promise; 
 
}

Спасибо за любую помощь вы можете предоставить!

ответ

0

Не уверены, если это по-прежнему актуально, но ваша проблема звучит подозрительно, как - this

Я также сталкиваюсь с точно таким же вопросом. В моем случае это происходит, когда IE прерывает запрос, и запрос не попадает на сервер. В этом случае xhr.status равен 0, а ответ пуст, поэтому синтаксический разбор JSON генерирует исключение.

Я не мог найти надежного исправления для этого, но моим обходным решением является повторная попытка повторных вызовов с теми же параметрами/полезной нагрузкой в ​​блоке ошибок, если ответ соответствует сценарию прерывания IE.

Cheers!