From 05e2c3196c857402a9aa93837b565e0a2736af23 Mon Sep 17 00:00:00 2001 From: Di Peng Date: Tue, 2 Aug 2011 16:44:25 -0700 Subject: feat($browser): JSONP error handling since we don't know if the error was due to a client error (4xx) or server error (5xx), we leave the status code as undefined. --- src/Browser.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src/Browser.js') diff --git a/src/Browser.js b/src/Browser.js index 815b6b24..a53687d5 100644 --- a/src/Browser.js +++ b/src/Browser.js @@ -100,12 +100,19 @@ function Browser(window, document, body, XHR, $log) { outstandingRequestCount ++; if (lowercase(method) == 'json') { var callbackId = ("angular_" + Math.random() + '_' + (idCounter++)).replace(/\d\./, ''); - var script = self.addJs(url.replace('JSON_CALLBACK', callbackId)); - window[callbackId] = function(data){ + window[callbackId] = function(data) { + window[callbackId].data = data; + }; + + var script = self.addJs(url.replace('JSON_CALLBACK', callbackId), null, function() { + if (window[callbackId].data) { + completeOutstandingRequest(callback, 200, window[callbackId].data); + } else { + completeOutstandingRequest(callback); + } delete window[callbackId]; body[0].removeChild(script); - completeOutstandingRequest(callback, 200, data); - }; + }); } else { var xhr = new XHR(); xhr.open(method, url, true); @@ -452,7 +459,7 @@ function Browser(window, document, body, XHR, $log) { * @description * Adds a script tag to the head. */ - self.addJs = function(url, domId) { + self.addJs = function(url, domId, done) { // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.: // - fetches local scripts via XHR and evals them // - adds and immediately removes script elements from the document @@ -465,6 +472,15 @@ function Browser(window, document, body, XHR, $log) { script.type = 'text/javascript'; script.src = url; if (domId) script.id = domId; + + if (msie) { + script.onreadystatechange = function() { + /loaded|complete/.test(script.readyState) && done && done(); + } + } else { + if (done) script.onload = script.onerror = done; + } + body[0].appendChild(script); return script; -- cgit v1.2.3