diff --git a/lib/adapters/xhr.js b/lib/adapters/xhr.js index 28456e69811c2dcf9480328ebad773f2eb555df4..70e56eec58d3303acf65f7374a32cd51379faff8 100644 --- a/lib/adapters/xhr.js +++ b/lib/adapters/xhr.js @@ -16,11 +16,15 @@ module.exports = function xhrAdapter(resolve, reject, config) { } var request = new XMLHttpRequest(); + var loadEvent = 'onreadystatechange'; + var xDomain = false; // For IE 8/9 CORS support // Only supports POST and GET calls and doesn't returns the response headers. if (window.XDomainRequest && !('withCredentials' in request) && !isURLSameOrigin(config.url)) { request = new window.XDomainRequest(); + loadEvent = 'onload'; + xDomain = true; } // HTTP basic authentication @@ -36,13 +40,20 @@ module.exports = function xhrAdapter(resolve, reject, config) { request.timeout = config.timeout; // Listen for ready state - request.onload = function handleLoad() { - if (!request) { + request[loadEvent] = function handleLoad() { + if (!request || (request.readyState !== 4 && !xDomain)) { return; } + + // The request errored out and we didn't get a response, this will be + // handled by onerror instead + if (request.status === 0) { + return; + } + // Prepare the response var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null; - var responseData = ['text', ''].indexOf(config.responseType || '') !== -1 ? request.responseText : request.response; + var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response; var response = { data: transformData( responseData,