Skip to content

Instantly share code, notes, and snippets.

@nanha
Created May 26, 2011 04:53
Show Gist options
  • Select an option

  • Save nanha/992575 to your computer and use it in GitHub Desktop.

Select an option

Save nanha/992575 to your computer and use it in GitHub Desktop.
JSONp using closure
var jsonp = {
callbackCounter: 0,
fetch: function(url, callback) {
var fn = 'JSONPCallback_' + this.callbackCounter++;
window[fn] = this.evalJSONP(callback);
url = url.replace('=JSONPCallback', '=' + fn);
var scriptTag = document.createElement('SCRIPT');
scriptTag.src = url;
document.getElementsByTagName('HEAD')[0].appendChild(scriptTag);
},
evalJSONP: function(callback) {
// eval이 아닌 JSON object 를 사용하도록 조치하기 위한 closure 도입.
return function(data) {
var validJSON = false;
if (typeof data == "string") {
try {
validJSON = JSON.parse(data);
} catch (e) {
/*invalid JSON*/
}
} else {
validJSON = JSON.parse(JSON.stringify(data));
window.console && console.warn('not valid JSON string');
}
if (validJSON) {
callback(validJSON);
} else {
throw("not valid json");
}
};
}
}
// 사용예제
/*
var obamaTweets = "http://www.twitter.com/status/user_timeline/BARACKOBAMA.json?count=5&callback=JSONPCallback";
jsonp.fetch(obamaTweets, function(data) {console.log(data[0].text)});
var reddits = "http://www.reddit.com/.json?limit=1&jsonp=JSONPCallback";
jsonp.fetch(reddits , function(data) {console.log(data.data.children[0].data.title)});
*/
@findchris
Copy link
Copy Markdown

Any concern about leaking memory if you do many JSONP requests on one page? There is no cleanup of your JSONPCallback_ methods.

@nanha
Copy link
Copy Markdown
Author

nanha commented Nov 9, 2011

oh. thanks. miss that

@sindhusp
Copy link
Copy Markdown

sindhusp commented Jan 2, 2013

Thanks for this!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment