éåæå¦çãã·ã¼ã±ã³ã·ã£ã«ã«æ±ãããã«
http://hail2u.net/blog/coding/synchronous-requests-to-jsonp.html
forã«ã¼ããªã並åãªã¯ã¨ã¹ãã§ã工夫次第ã§ã§ããã¨æããã©ãåå¾çãªä¾åé¢ä¿ãåãªã¯ã¨ã¹ãã«ããå ´åã¯ããã£ã±ãç´åå¦çãããªããã°ãããªãã
2ã3段ãããã®ç´åå¦çãªãã³ã¼ã«ããã¯é¢æ°ãé£éããã¦æ¸ããããã¤ã³ã©ã¤ã³ã§ç¡å颿°æå®ããããã¦ãå°ããªãã¨æããã©ããã£ã¨å¤æ®µéã®ç´åå¦çãã³ã¼ã«ããã¯é¢æ°åã®æå®ã ãã§è¨è¿°ãããã¨ããã¨ãã³ã¼ããæ¸ã人ã§ãé ã®ä¸ã«ã¡ããã¨ããã¼ã®ã¤ã¡ã¼ã¸ãåºæ¥ä¸ãã£ã¦ãªãã¨å³ããããã³ã¼ããèªãå´ã¯ãã£ã¨ãããããããã¨ã«ãªãã
ãã¨ãã°
- del.icio.usããnetworkæ å ±ãJSONPã§åå¾(http://del.icio.us/feeds/json/network/stomita)
- del.icio.usããfanæ å ±ãJSONPã§åå¾(http://del.icio.us/feeds/json/fans/stomita)
- ä¸è¨çµæãã mutual connectionï¼networkã¨fanã®åæ¹ã«ç»é²ããã¦ããIDãªã¹ãï¼ãæ½åº
- del.icio.usããèªåèªèº«ã®tagãªã¹ããJSONPã§åå¾(http://del.icio.us/feeds/json/tags/stomita)
- èªåèªèº«ããã£ã¨ãé »ç¹ã«tagãã¦ããã¿ã°ã§çµãè¾¼ãã§ãmutual connectionã®postsããã¹ã¦JSONPã§åå¾
- åå¾ããpostsã®ä¸ããã©ã³ãã ã«ä¸ä»¶é¸æ
- 鏿ãããURLã®はてブコメントをJSONPで取得
- ã¯ã¦ãã³ã¡ã³ããMECAPI API(JSONP)ã§å½¢æ ç´ è§£æ
- ããã«å½¢æ ç´ è§£æããããã¼ã¯ã¼ããå ã«Yahoo! Web Search JSONPã§æ¤ç´¢å®è¡
ã¿ãããªä¸é£ã®å¦ç*1ãæ¸ãã®ã¯ãé©åã«é¢æ°ã§åããããã¦ãçµæ§ã¤ããããããããå ¨é¨ã«ç®ãéããªãã¨æµããçè§£ã§ããªãã
ã¤ã¾ããéåæå¦çã§ãã£ã¦ããã§ããã ãã·ã¼ã±ã³ã·ã£ã«ãªè¨è¿°ã§ã¡ããã¨æµããçè§£ã§ããããã«ã³ã¼ãã£ã³ã°ããããªããã¨æã£ã¦ããã
ã¨ãããã¨ã§ãæè¿ãããªã®ãæ¸ãã¦ã¿ãã
æ©è½ã¨ãã¦ã¯ãå¦çãè¨è¿°ãã颿°ã®é åããããããä¸ãã¦ããã¨ããã®å¦çãé åã«æå®ãããé ã«é 次å®è¡ãã¦ããã¨ããã ãã®ãã®ã
ãã ããéåæå¦çã®ããã«ï¼æ¬ä¼¼çã«ï¼é 次å®è¡ããã»ã¹ã忢ããsuspend()ãããã³åæ¢ãããããã»ã¹ãåã³éå§ããresume()ãå®ç¾©ãã¦ããã
å颿°ã®éã§ã®ãã¼ã¿åãæ¸¡ãã¯ãSequentialActionãªãã¸ã§ã¯ãã«contextã¨ããããããã£ãå®ç¾©ãã¦ããããããä»ãã¦è¡ãã
ä½¿ãæ¹ã¯ãããªæãã§ãããã§ã¯del.icio.usãããã¯ã¼ã¯ã«ç»é²ããã¦ããå ¨IDã®ãã¹ãããã§ãããã¦ããå¦çããã·ã¼ã±ã³ã·ã£ã«ã«å®è£ ãã¦ããã
http://stomita.web.fc2.com/seqtest.html
var actions = [ // del.icio.usã®networkæ å ±ããã§ãã function() { var url = 'http://del.icio.us/feeds/json/network/'+this.context.username; JsonWebServicesStub.invoke(url, this.resume.bind(this)); // JSONPå¼ã³åºããéåæå¦ç this.suspend(); // ããã»ã¹ã䏿¦åæ¢ãéåæå¦çå¾ ã¡ } , // åå¾ããnetworkæ å ±ã夿°ã«ã¹ã㢠function() { this.context.network = this.context.returned; // ç´åã®JSONPãªã¯ã¨ã¹ãã§ã®æ»ãå¤ } , // del.icio.us postsã®ãã§ããã®ããã®ã«ã¼ãã®ã¹ã¿ã¼ã function fetchPostsLoopStart() { var user = this.context.network.pop(); if (user) { this.context.postUser = user; } else { this.goto('renderPosts'); // ã«ã¼ãçµäºãã¬ã³ããªã³ã°ã¸ } } , // æå®ãããã¦ã¼ã¶ã®del.icio.us postsããã§ãã function() { var url = 'http://del.icio.us/feeds/json/'+this.context.postUser; JsonWebServicesStub.invoke(url, this.resume.bind(this)); // JSONPå¼ã³åºããéåæå¦ç this.suspend(); // ããã»ã¹ã䏿¦åæ¢ãéåæå¦çå¾ ã¡ } , // åå¾ããpostsãå ¨ä½ã«ãã¼ã¸ function() { var posts = this.context.returned; // ç´åã®JSONPãªã¯ã¨ã¹ãã§ã®æ»ãå¤ this.context.allPosts = this.context.allPosts ? this.context.allPosts.concat(posts) : posts; this.goto('fetchPostsLoopStart'); // ã«ã¼ãéå§ã¸æ»ã } , // postsãã¬ã³ããªã³ã° function renderPosts() { var template = TrimPath.parseTemplate($('postsViewTemplate').value) $('postsView').innerHTML = template.process({ posts : this.context.allPosts }); // for benchmark; alert(new Date().getTime() - this.context.startTime + 'msec'); } ]; // end of action definitions var seq = new SequentialAction(actions); seq.start({ username : 'stomita', startTime : new Date().getTime() });
ã·ã¼ã±ã³ã·ã£ã«ã¨ãããªãããgotoããµãã¼ããã¦ã«ã¼ãå¦çããã¦ããã
ãã¶ãããããã£ã¨çºå±ãããã¨ãåå²ã並åå®è¡å¾ ã¡ãå«ãã¦ãã¹ãã¼ããã·ã¼ã³ã¿ãããªå®è£ ã«ãªã£ã¡ããããããã ãããã¾ã§ããã¨ä»åº¦ã¯ã³ã¼ãè¨è¿°ããããã«ãããªããªãã¨æã£ã¦ãã®ã§ããã¶ããããªãã
ï¼è¿½è¨ï¼
ãã£ã±ã並åå®è¡å¾
ã¡ã®æ©è½ãä½ã£ã¦ã¿ãã
var actions = [ function() { var url = 'http://del.icio.us/feeds/json/network/'+this.context.username; JsonWebServicesStub.invoke(url, this.resume.bind(this)); this.suspend(); } , function() { this.context.network = this.context.returned; for (var i=0; i<this.context.network.length; i++) { var postUser = this.context.network[i]; var url = 'http://del.icio.us/feeds/json/'+postUser; var subproc = this.fork('sp'+i); // ï¼çä¼¼ï¼ãµãããã»ã¹ãæ°è¦ä½æ JsonWebServicesStub.invoke(url, subproc.join); // éåæãªã¯ã¨ã¹ãçµäºæã«ä½æãããµãããã»ã¹ãåå } this.wait(); // ãµãããã»ã¹ã®å®è¡çµäºå¾ ã¡ } , function() { var posts = []; for (var i=0; i<this.context.network.length; i++) { posts = posts.concat(this.context.returned['sp'+i]); // ãµãããã»ã¹ãã¨ã®JSONPå®è¡çµæããã¼ã¸ } var template = TrimPath.parseTemplate($('postsViewTemplate').value) $('postsView').innerHTML = template.process({ posts : posts }); // for benchmark; alert(new Date().getTime() - this.context.startTime + 'msec'); } ]; // end of action definitions var seq = new SequentialAction(actions); seq.start({ username : 'stomita', startTime : new Date().getTime() });
*1:ãã®å¦çèªä½ã«æå³ããããã¯ç¥ããªããã©ããããªmashupããã»ã¹ãä»ãå ¨é¨ãã©ã¦ã¶å´ã§ã§ãã¡ããã®ã ãããé¢ç½ã