ãã®èšäºã§ã¯ãdeferredã "deferred"ïŒjQuery.DeferredïŒãšåŒã°ããããŒãžã§ã³1.5ã®jQueryã©ã€ãã©ãªãæäŸããéåæããã»ã¹ãããã³é¢é£ãããªããžã§ã¯ããšã¡ãœãããå®éã«ã©ã®ããã«äœ¿çšã§ãããã«ã€ããŠãããã€ãã®èããå ±æããããšæããŸãã ã
ãã¡ããã deferred / promiseã®ãã¢ãæ±ããšãããããã¯ã«ã€ããŠã¯ããã§ã«12以äžã®èšäºãå·çãããŠããŸãã ç§ã®ç®æšã¯ãåå¿è ã«ç解ã§ããªãè€éããžã®ææãå¿ããæ©äŒãäžãã次ã«éåæããã»ã¹ã§åäœããç解å¯èœã§ããæ§é åãããã³ãŒããæžãããã®å¥ã®äžæ©ãèžã¿åºããããªç¥èãæäŸããããšã§ããã ç§ã¯ããã®ãªããžã§ã¯ãã䜿çšããããã®é 延ãåæãããã³å žåçãªãã¿ãŒã³ã䜿çšããããšã§ç°¡åã«è§£æ±ºãããåé¡ã«ãããªããšããªãã®æ³šæãéäžããããšæããŸãã
éåæããã»ã¹
ãã®ãããéåæããã»ã¹ã¯ãä»ã®ã³ãŒããšäžŠè¡ããŠå®è¡ã§ãããšæ³å®ããŠããããã®å®è¡çµæã¯ããããåŒã³åºããŠããããã°ã©ã ã§ããã«äœ¿çšå¯èœã«ãªããŸããã ãã¡ãããããã¯å¥åŠã§ãã åæã¢ã¯ã·ã§ã³ã§ã¯ãªããäºãã«äžŠè¡ããŠå®è¡ãããé 次ã§ã¯ãªãã次ã ã«å®è¡ãããŸããïŒ ç¢ºç«ãããçšèªãæ£åœåããããã«ïŒããã»ã¹ããåæãã§ãããšèšã£ãŠãæã ã¯ãã®çµæãçŸããç¬éãããªãã¡ 1ã€ã®ããã»ã¹ã®çµäºã¯ã次ã®ããã»ã¹ã®å®è¡ã®éå§ã®ç¬éãšäžèŽãããããã®çµäºãšéå§ã¯åæãããŸãã
var result = readValueBy(key); console.info(result);
ãéåæãããããã£ã¯ãããã»ã¹ã®çµæãæ¥ãããšã瀺ããŠããŸããããããçºçããããã°ã©ã å ã®æ£ç¢ºãªå Žæã瀺ãããšã¯äžå¯èœã§ãã éåæããã»ã¹ã®çµæãåŠçããããžãã¯ãèšè¿°ããããã«ãããã°ã©ããŒã¯ã³ãŒã«ããã¯é¢æ°ãŸãã¯ã³ãŒã«ããã¯é¢æ°ã«é Œã£ãŠãå®éã®å ¥åãã©ã¡ãŒã¿ãŒã®åœ¢åŒã§äœæ¥ã®çµæãæž¡ããŸãã
éåæããã»ã¹ã®äŸ
ç§ãã¡ã¯ãajaxãªã¯ãšã¹ããéåæããã»ã¹ã«ãªãåŸããšããäºå®ã«æ £ããŠããŸãã ãããŠãjQueryã®äŸ¿å©ãã䜿çšããŠãµãŒããŒåŒã³åºããäœæããã¿ã¹ã¯ã«çŽé¢ãããšããç§ãã¡ã¯äœãèããã«æ¬¡ã®ãããªãã®ãäœæããŸãã
$.post("ajax/test.html", function( data ) { $( ".result" ).html( data ); });
ããã«ãããã¯
$.post()
ã¡ãœããã®å ¬åŒjQueryããã¥ã¡ã³ãã®äŸã§ãïŒãåç § ïŒã
2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ã³ãŒã«ããã¯é¢æ°ãã¡ãœããã«æž¡ããŸããã¡ãœããã¯çµæãæåã®åŒæ°ïŒãµãŒããŒã®å¿çïŒãšããŠåãåããŸã
ãã®ãããªãªã¯ãšã¹ãã®ä»£æ¿æ段ã次ã«ç€ºããŸãã
$.ajax({ type: "POST", url: "ajax/test.html", data: data, success: function( data ) { $( ".result" ).html( data ); }, dataType: dataType });
ãã®äŸã§ã¯ãæåãã³ãã©ãŒã¯ãä»ã®ãã©ã¡ãŒã¿ãŒãšå ±ã«ãªããžã§ã¯ãã®
success
ããããã£ãšããŠæž¡ãããŸãã
ãã ããjQuery 1.5以éã§ã¯ããã³ãã©ãŒãæž¡ããã«ajaxã¡ãœããïŒ$ .getã$ .postã$ .ajaxïŒãåŒã³åºãããšãã§ããŸãã ãããã®ã¡ãœããã¯ãXMLHTTPRequestãªããžã§ã¯ãã ãã§ãªããPromiseã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã¡ãœããã§ãªãŒããŒããŒãããããã®ãªããžã§ã¯ããè¿ããŸã ã å®çšçãªèŠ³ç¹ãããããã¯éåæããã»ã¹ïŒ=ãµãŒããŒãžã®ãªã¯ãšã¹ãïŒãéå§ããããšã«ãããå®è¡ã®æåããšã©ãŒç¶æ³ã®åŠçãªã©ã®ããã«æ¥ãã§ã³ãŒã«ããã¯ã瀺ãããšãã§ãããããããæå®ããå¿ èŠããããšãã«èªåèªèº«ãå¶éããªãããšãæå³ããŸãã ãµãŒããŒãªã¯ãšã¹ããå€æ°ã«ä¿åã§ããŸãïŒ
function api(key, data) { return $.post('ajax/' + key, data); } // .. var requestData = { id: '79001' }, storeDataRequest = api('get_store_by_id', requestData); //
...ãã®åŸãå¿ èŠãªãã¹ãŠã®ã³ãŒã«ããã¯ãããã³ã°ããããŸãã
function addStandardHandlers(request, requestData, model) { request.done(function(data){ // , // model.received(requestData, data && data.payload); }).fail(function(){ // // , model.received(requestData, null); }); } function addUIHandlers(request, $messageHolder) { // .. request.done(function(data){ // .. "", $messageHolder.text('Success'); }).fail(function(){ // - // ", " $messageHolder.text('Error, please retry.'); }).always(function(){ // , , , // window.setTimeout(function(){ $messageHolder.fadeOut(); }, 3000); }); } // , addStandardHandlers(storeDataRequest, requestData, context.getModel()); // , UI addUIHandlers(storeDataRequest, $('.main_page-message_holder'));
ããã°ã©ã ã«ãµãŒããŒã«æ¥ç¶ããå¿ èŠãããå Žæã101ç®æãããã©ãã§ãå¿çæ§é ãåãåŠçãå¿ èŠãšããå ŽåããµãŒããŒã®ã³ãŒã«ãã€ã³ãã§ãã³ãã©ãŒã«åãã³ãŒããçæãããå¿ èŠã«å¿ããŠãªã¯ãšã¹ãã®åã€ã³ã¹ã¿ã³ã¹ãããã³ã°ããããAjaxãªã¯ãšã¹ããä»ãçŽæã§ããããšãç¥ã£ãŠããŸãã 以äžã®çŽæã«ã€ããŠåç §ããŠãã ããã
ãã®ä»ã®éåæããã»ã¹
æ»ã£ãŠã察åŠããªããã°ãªããªãä»ã®éåæããã»ã¹ã®äŸãæããŸãããã
- 1ã€ä»¥äžã®ç»åãã¢ããããŒãããŸãïŒãã®åŸã®ãµã€ãºã®èšå®ãããã³ç»åã®èªã¿èŸŒã¿ãŸãã¯å€±ææã«äœããã®æ±ºå®ãè¡ããŸãïŒ
- ããã¥ã¡ã³ãã®æºåç¶æ ã®çºçïŒ dom readyã€ãã³ãïŒ
- ã¿ã€ã ã¢ãŠãç¶æ ã®éå§
- ã€ãã¬ãŒã¿ã«å®è£ ãããé·ãèšç®ã®å®äºãšã¿ã€ã ã¢ãŠãã®ãŒã
- ããŒãžèŠçŽ ã®ã¢ãã¡ãŒã·ã§ã³ã®å®äº
- ãã€ã¢ãã°ããã¯ã¹ã®çµæïŒãOK /ãã£ã³ã»ã«ãïŒïŒããšãã°ããã€ã¢ãã°ããã¯ã¹ã¯ããã£ã³ã»ã«ãã¿ã³ãäžéšã®ååãããã«ãŠã£ã³ããŠã®åšå²ã®èæ¯ãã¯ãªãã¯ããŠãéããããšãã§ããŸãããããã¯ãã€ã¢ãã°ã§æäŸãããæäœãéæããŠããªããšè§£éã§ããŸãïŒã
- ç°çš®ã€ãã³ãã®åæçºçïŒããšãã°ãå ¥åãã©ãŒã ã®ãã¹ãŠã®æ¡ä»¶ãžã®æºæ ããªã¹ããããã¹ãŠã®ç»åãããŠã³ããŒããããã³ãã¬ãŒããå«ããã¡ã€ã«ãããŠã³ããŒãããïŒããŸãã¯äºæ³ãããã€ãã³ãã®å°ãªããšã1ã€ãçºçããïŒã¿ã€ã ã¢ãŠãã10ç§ã®ããªããŒãããã¿ã³ïŒ
é 延ã¯ã©ã®ãããªåé¡ã解決ããŸããïŒ
é¢æ°ã®ãã©ã¡ãŒã¿ãŒãŸãã¯ãªããžã§ã¯ãã®ããããã£ãšããŠã³ãŒã«ããã¯ãæž¡ã以äžã®ãã®ãå¿ èŠãªç¶æ³ã«ã€ããŠèããŠã¿ãŸãããïŒäžèšã®ç°¡åãªajaxã®äŸã§èŠãããã«ïŒïŒ
- åãããã»ã¹çµäºã€ãã³ãã«è€æ°ã®ã³ãŒã«ããã¯ãå²ãåœãŠãæ¹æ³ã¯ïŒ
- å®äºåŸã«äºæ³ãããã€ãã³ãã®çºçãèªèããæ¹æ³ã¯ïŒ
- 1ã€ã®ããã»ã¹ã§åŠçãããç¶æ³ã®ã¿ã€ãããšã«ãã¹ãŠã®ã³ãŒã«ããã¯ãã³ãã©ãŒãã°ã«ãŒãåããæ¹æ³
è€æ°ã®onloadã€ãã³ããã³ãã©ãŒã®æåã®ãã€ã³ãã®åé¡ãã©ã®ãããåã«è§£æ±ºããããèŠããŠããŸãã
window.onload = (function(oldHandler){ return function(){ if (oldHandler) oldHandler(); // new code here.. }; })(window.onload);
ãããéå»ã®åé¡ã§ããããšã¯è¯ãããšã§ãã ä»æ¥ãããã¥ã¡ã³ãã€ãã³ãã«ã€ããŠè©±ããŠããå Žåããããè¡ã人ã¯ããŸããïŒç§ã¯é¡ã£ãŠããŸãïŒã ãããŠçŽ$ .DeferredïŒïŒ-ä»ã®ãã¹ãŠã«ã€ããŠè©±ããšãã ïŒæå³çãªèªåŒµã«ã€ããŠã¯ç³ãèš³ãããŸãããããã¬ãŒã·ã§ã³ã®ç®çãæãããŸããïŒããŠããè€æ°ã®ãã³ãã©ãŒã§äœããã¹ããïŒãã¯å¥ã®è³ªåã§ãã ããšãã°ãäžæ¹ãããŒã¿ã解æã§ããããäžæ¹ã-äžèšã®äŸã§ææ¡ããããã«ãéçšææšãé衚瀺ã«ããããã¹ããŒã¿ã¹ããã¹ããå€æŽãããšããŸãã 以åã¯ãã¢ãã«ãšãã£ã¹ãã¬ã€ã®äž¡æ¹ã1ã€ã®ãã³ãã©ãŒã«æŒã蟌ãå¿ èŠããããŸããããä»ã§ã¯å ±æã®èªç±ããããŸãã
ãŸããæ°å¹Žåã 2çªç®ã®ãã€ã³ãã¯ããã³ãã©ãŒã®æ¬äœãéããããŠãããã©ã°å€æ°ã®åšãã«äœããã®çš®é¡ã®ç©ã¿äžããããããšã«ãã£ãŠè§£æ±ºãããŸããã ãŠã£ãžã§ãããããŒãããããŸã§ã«ãã§ã«dom readyãå®è¡ãããŠããããšããŠã£ãžã§ããã«äŒããæ¹æ³ã«ã€ããŠã©ã®ããã«èããããã¯ã£ãããšèŠããŠããŸãã ãããã
$(function(){ ... })
ããããŸããããããã¯é 延ã䜿çšããŠjQueryã«å®è£ ãããŠããŸãã ããã¯ã dom readyã€ãã³ããçºçããåŸã«ã³ãŒããå®è¡ãããå Žåã§ãããã®èšèšã®ã³ãŒã«ããã¯ãæ©èœããããšãæå³ããŸãã 䜿çšãã¿ãŒã³ã¯ç°¡åã§ãã ãã³ãã©ãŒãããã³ã°ã¢ãããããŸãã ããã»ã¹ãæ¢ã«å®äºããŠããå Žåããã³ãã©ãŒã¯ããã«å®è¡ãããŸãã ããã§ãªãå Žåããã³ãã©ãŒïŒãã®ã¿ã€ãã®ãã¹ãŠã®ãã³ãã©ãŒïŒã¯ãå°æ¥ã®çºçæã«å®è¡ãããŸãã
3çªç®ã®åé¡ã解決ããããã«å»¶æããŠã¿ãŸãããã 延æã§ã¯ãããã»ã¹ãæ£åžžã«å®äºããããã®ãã³ãã©ãŒã®ã°ã«ãŒãããããŸãã 倱æ ïŒèª€ã£ããŸãã¯äºæããªãïŒçµäºã®å Žåã ä»»æã®çµããã«åŒã³åºãããã°ã«ãŒãïŒãæãïŒããããŸãã ãã³ãã©ãŒãæäœã®é²è¡ç¶æ³ã远跡ã§ããã°ã«ãŒãããããŸãã
ããã§ã$ .DeferredïŒïŒã䜿çšããŠè§£æ±ºããã3ã€ã®åé¡ã調ã¹ãŸããã
é 延ã䜿çšããããã®åææ¡ä»¶
ããã°ã©ã ã§é 延ã䜿çšããããšãæ€èšããå¿ èŠãããå Žåã®æ¡ä»¶ã®æŠèŠã説æããŸãã
ãã®åŸãDeferredã®äœ¿çšã«ã€ããŠèããŸãã
- ç¶æ ã®éå§ãåŸ æ©ãããã®éå§ããã³/ãŸãã¯é¢é£ããŒã¿ã®ã€ã³ãžã±ãŒã¿ãä¿åããå¿ èŠãããå Žåã æ¡ä»¶ã®çºçãåŸ ã€ããšãæåã®æ¡ä»¶ã§ãã
- 2çªç®ã®æ¡ä»¶ã¯ãé·ãããã»ã¹ã®ã³ãŒãã®çžå¯Ÿçãªé 眮ãšããã®å€æŽ/å®äºãåŠçããã³ãŒãã«ã€ããŠèãããšãã§ãã Deferredã䜿çšãããšãåä¿¡æ¹æ³ãšåŸç¶åŠçã®æ¹æ³ã決å®ããããšã§ãããŒã¿/çµæãååŸããæ¹æ³ã®å®çŸ©ããã¢ã³ãã£ãã§ããŸãã
æåã®æ¡ä»¶ã®ç¹åŸŽã¯ãæ¡ä»¶ãçºçããç¬éã ãã§ã¯ãªããæ¡ä»¶ã®éå§ã§ããããšã«æ³šæããŠãã ããã ããã«ãããjQueryã®éåžžã®ã€ãã³ãåŠçã¡ã«ããºã ãšDeferredãåºå¥ãããŸãã ã€ãã³ããçºçãããã³ãã©ãšåŒã°ããå¿ããããŸããã èšå®ããDeferredã«ãã£ãŠæ±ºå®ãããããã»ã¹ã®ç¶æ ã¯ãDeferredãæ ŒçŽããŠããéãæç¶ããŸãã
2çªç®ã®åæã ã³ãŒããèŠãŠã¿ãŸãããã
$.post("ajax/cart", function( data1 ) { // 1. // data1 // if (data1 && data.success) .... // 2. // var processedData1 = data1.payload; // 3. // : $.post("ajax/shipping", processedData1, function( data2 ) { // 1. // 2. var processedData2 = data2.payload; // 3. $.post("ajax/payment", data2, function( data3 ) { // 1. // 2. var processedData3 = data3.payload; // 3. $( ".result" ).html( processedData3 ); }); }); });
æåã®èŠæ±ã¯ããŒã¿ãåãåããããã«åºã¥ããŠ2çªç®ã®èŠæ±ãè¡ããããã®çµæã«åºã¥ããŠ-åŸç¶ã®èŠæ±ãªã©ãè¡ãããŸãã ãªã¯ãšã¹ãã¯3ã€ã ãã§ãããžãã¯ã¯ç€ºãããŠããã ãã§ãããç¥ãããŠããã¢ã³ããã¿ãŒã³ãéåœã®ãã©ããããïŒéåœã®ãã©ãããïŒãæ¢ã«ãããŸãã
ç§ãããŸããŸåå ãããããžã§ã¯ãã®1ã€ã§ãã¿ã¹ã¯ã¯å¯ãã«åäœããæ¯æãã·ã¹ãã ãµã€ãããã©ãããããããšã§ããïŒCGIã§èšè¿°ãããŠããããµããŒããããŠããªãã£ããããã¹ã¿ã€ãªã³ã°ãå€æŽããµã€ããžã®åã蟌ã¿ã®åé¡ã¯ãããŸããã§ããïŒ-çŸããããŒãžWordPressã§ãæ¥é°ã§ããéåæã®ååŸããã³ãã¹ããªã¯ãšã¹ãã䜿çšããŠããŠãŒã¶ãŒã¢ã¯ã·ã§ã³ããšãã¥ã¬ãŒãããŸãïŒã«ãŒãããŒãžã®å ¥åãååã®åéèšããã©ãŒã ã®éä¿¡ãéä¿¡ã®ç¢ºèªããŒãžã®åä¿¡ãã¢ãã¬ã¹ã®å ¥åã2çªç®ã®ãã©ãŒã ã®éä¿¡ãæ¯æãããŒã¿ã®å ¥å..ïŒ ç§ã¯ç¥ã£ãŠãããç¥ã£ãŠããã ããã¯æªãã§ãã 詳现ãèŠããŠããã®ã¯æ¥ããããã§ãã ãã€ãŠãç§ã¯ããã«è¡ã£ãŠãªãã¡ã¯ã¿ãªã³ã°ããããšãæããŠããŸããã ãããŸããããŸãããã ããããææªã®äºæ ã¯ãæ¯æãããžãã¯ãå«ãæ¹æ³ã6ã¬ãã«ãŸãã¯7ã¬ãã«ã®ãã¹ããæã¡ãç»é¢ã®é«ãã10åã«ããããšã§ãã ãã®æ±ºå®ã«ããããã®æ¹æ³ã®ã¿ããµããŒãããããCGIããŒããããã¹ã¿ãŒãããã®éžæã¯æçœã§ã¯ãªããªããCGIããããã«æå©ã«ãªããŸããã ä»ããã®ãããªæ±ºå®ã§äœãããŸããïŒè³Œå ¥ã®ã·ãŒã±ã³ã¹ãæš¡å£ããããšã¯ãOKãã§ãããµããããŸãããïŒã
æåã«ãã¡ãœããã®ããžãã¯ãã¹ãããã«åå²ããŸãã äžèšã®äŸã«åºã¥ããŠèª¬æããŸãã
function purchaseStep01_CartDataRequestFor(input) { return $.post("ajax/cart", input); } function purchaseStep02_UpdateShippingInfoRequestFor(input) { return $.post("ajax/shipping", input); } function purchaseStep03_SubmitPaymentDetailsRequestFor(input) { return $.post("ajax/payment", input); }
第äºã«ããªã¯ãšã¹ããéä¿¡ããã ãã§ã¯äžååã§ããåçã解æããããã®äžè¬çãªæ©èœãšããŠæäŸããå¿ èŠããããŸãã
// : // - - - // / function handleResponseData(request, specificLogic) { // -promise, fail // , AJAX , // success==true // ( ) // , return $.Deferred(function(def){ request .fail(def.reject) .done(function(data){ if (!data || !data.success) return def.reject(); if (!specificLogic) return def.resolve(data); try { def.resolve(specificLogic(data)); } catch (e) { def.reject(e); } }); }).promise(); }
...ããã³åãªã¯ãšã¹ãã®çµæãåå¥ã«åŠçããããã®ããžãã¯ã äžèšã䜿çšããŠãã®ããžãã¯ãšäºææ§ããããŸãã
// 1. . . var step01_CartDataPromise = handleResponseData( purchaseStep01_CartDataRequestFor(data), function (data){ // . // - , fail. if (!data.cart) throw new Error('Cart info is missing'); // - , cartInfo . return data.cart; }), // <- , .. . // 2. 1. // : // step02_ShipInfoPromise = step01_CartDataPromise.then().done(function(cartInfo){... // then() , // . jQuery step02_ShipInfoPromise = step01_CartDataPromise.then(function(cartInfo){ return handleResponseData( purchaseStep02_UpdateShippingInfoRequestFor({ id: cartInfo.id}), function (data){ if (!data.shipping) throw new Error('Shipping info is missing'); return { cart: cartInfo, shipping: data.shipping }; }); }), // 3. 2. step03_PaymentResultPromise = step02_ShipInfoPromise.then(function(prePurchaseInfo){ return handleResponseData( purchaseStep03_SubmitPaymentDetailsRequestFor(prePurchaseInfo), function (data){ if (!data.payment) throw new Error('Payment gone wrong'); return data.payment; }); }); // <- // , // // done() then() function(paymentInfo).. // function(prePurchaseInfo).. . // . 2. step03_PaymentResultPromise.then(function(paymentInfo){ $('.result').html( paymentInfo.message ); });
ãã®æ±ºå®ã®çæïŒ
- ããžãã¯é¢æ°ã®ãã¬ãŒãã³ã°ã«ãããã³ãŒãã¯ããå€ãã®è¡ã«æžã蟌ãŸããŸã
-
$.Deferred(..)
ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã®ããã«æ©èœããããèŠããŠããå¿ èŠããã$.Deferred(..)
ãŸãã2ã€ã®ãããã¹ã次ãã次ãžãšãªã³ã¯ããæ¹æ³$.Deferred(..)
ãèŠããŠããã®äžã«ãããã¹ãäžããããšãå¿ããªãã§ãã ãããã€ãŸã promiseãè¿ãhandleResponseData
é¢æ°ãåŒã³åºãåã«return
å¿ããªãã§ãã ããã
é·æïŒ
- ããŒã¿ãéä¿¡ããããžãã¯ãšåä¿¡ããå¿çãåŠçããããžãã¯ã®å€æ§æ§
- ããå Žæã§ã®æäœã®æåãšãå€éšãããã®æ±ºå®ã«åœ±é¿ãäžããããªãããšã«é¢ããææ決å®ã®ããžãã¯ã®å Žæã
handleResponseData()
ã¡ãœããã®$.Deferred(..).promise()
ã®æã - ç°ãªã段éã§ã®åãæäœã®æåã«é¢ãã決å®ããžãã¯ã®å Žæã
handleResponseData()
å ã®def.reject(..)
åŒã³åºãã«æ³šæããŠdef.reject(..)
ã ãµãŒããŒãåäœãæåŠããå Žåã ãã§ãªããæ£åžžã«åäœãããäžååãªããŒã¿ãè¿ãããå Žåããæäœã¯å€±æãããšèŠãªãããŸãã ãŸããããŒã¿ãåŠçåŸã«æ€èšŒã«åæ Œããªãã£ãå ŽåïŒcatch(e){ .. }
ãã©ã³ãïŒã 次ã«ã$ .Deferredã䜿çšããã«å®è£ ããæ¹æ³ãèããŸãã - ããžãã¯ã®æ§é åã®æ¹åããã¹ãã®åæžããµããŒãæ§ã®åäžã
æ°ãšè³ªã®äž¡æ¹ãäžåãå©ç¹ããããšäž»åŒµãã人ã¯ã»ãšãã©ããŸããã
åæãå®èšŒããããã§ãã ããã«é²ã¿ãŸãããã äŸãå§ããåã«ãçŽæã«ã€ããŠããã€ãã®èšèãçŽæããŸãã
çŽæ
é 延ãªããžã§ã¯ããžã®ãªã³ã¯ããããããããã°ã©ã ã¯ããã»ã¹ã®çµæïŒããã»ã¹èªäœã§ã¯ãªããå Žåã«ãã£ãŠã¯ããã§ããïŒãå¶åŸ¡ãããã¹ãŠã®ãªã¹ããŒã«çµæããäŒãããæ©èœãåããŠããŸãã ãã ãããã®é 延ãªããžã§ã¯ãã«é¢é£ä»ããããŠããpromiseãªããžã§ã¯ãããŸãã¯ãpromiseãã¯ãããã°ã©ã ã«ããªã¹ãã³ã°ãå°çšã®ã¡ãœããã»ãããæäŸããŸãã ïŒãã®ãããã¯ã«é¢ãããŠã£ãããã£ã¢ã®èšäºã§ã¯ããã®ãããªèªã¿åãå°çšãªããžã§ã¯ãã¯futuresïŒfutureïŒãšåŒã°ãã$ .Deferredã¯jQueryãšããŠæ©èœããŸããæ··ä¹±ããªãããã«ããŠãã ãããïŒå®éããã®æš©éã®åé¢ã«ãããã³ãŒãã¯ãæ³å®ãããŠããªããããšããããã®ã§ãã
var def = $.Deferred(); // , // "" def.resolve() def.reject() // // readonly- promise, // def // "" var promise = def.promise()
ã»ãšãã©ã®å Žåãé 延åç §ã䜿çšããæã䟿å©ã§å®å šãªæ¹æ³ã¯ãäœææã«ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæž¡ãããé¢æ°å ã§ããžãã¯ãå®çŸ©ããããšã§ãã
$.Deferred(function(def){ // , // resolve() reject() // . });
ãã®ãããªäœ¿çšã¯ã
.promise()
åŒã³åºãããšã«ããããã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹ããããã¯ããããã«ãããã«ïŒå¿ããã«ïŒãæ»ããããšãã§ããŸãã
ç°¡åãªäŸã ã¿ã€ã ã¢ãŠãã®éå§ã¯ãããã»ã¹ã®æ£åžžãªå®äºã決å®ããŸãã
function doneTimeout(timeout) { return $.Deferred(function(def){ window.setTimeout(def.resolve, timeout); }).promise(); }
çŽæã«ã€ããŠè©±ãçŽæãæãããããã§ãã äŸã
äŸ
ãã°ããåã«ã延æ/çŽæã®æŠå¿µãèããããšãå®å šã«ã§ããªãã£ããšèšããŸã ã
åçãã¢ããããŒããã
ç¹ã«ãããã§åçã®èªã¿èŸŒã¿ãå¶åŸ¡ããæé ã«ã€ããŠç¥ããŸããã ããããåçãããŒãããããã©ããã ãã§ãªãããã®ãµã€ãºãèªèã§ããããã«ããããè¿œå ããããã«ãªããŸããïŒ
var loadImage = createCache(function(defer, url) { var image = new Image(); function cleanUp() { image.onload = image.onerror = null; } defer.then( cleanUp, cleanUp ); image.onload = function() { defer.resolve( url, { width: image.width, height: image.height }); }; image.onerror = defer.reject; image.src = url; });
ããã¥ã¡ã³ãã®æºåå®äºç¶æ ã®çºçã®å€å®
ãã§ã«
$(function(){.. })
ã ããã¥ã¡ã³ãã®æºåãæŽã£ããšããçŽæã®ãªããžã§ã¯ããçŽç²ãªåœ¢ã§ååŸããæ¹æ³ãæããŠãã ããã
var domReadyPromise = $.ready.promise();
ã¿ã€ã ã¢ãŠãã¹ããŒã¿ã¹ã®éå§
ã¿ã€ã ã¢ãŠãã®äŸã«ã€ããŠã¯æ¢ã«æ€èšããŸãããã¿ã€ã ã¢ãŠãã®çºçã«ã¯ãããã»ã¹ã®æ£åžžãªå®äºãå¿ èŠã§ãã
doneTimeout()
ãŸãã ããããã¿ã€ã ã¢ãŠãã«ãã£ãŠããã»ã¹ããšã©ãŒã§å®äºãããšèŠãªããããªãã·ã§ã³ãå¿ èŠã«ãªããŸããã ããã«ãããŸãïŒ
function failTimeout(timeout) { return $.Deferred(function(def){ window.setTimeout(def.reject, timeout); }).promise(); }
10ç§åŸã«èªåçã«æŒãããããã¿ã³ãæŒããã©ãããæ°ã«ããªããã¿ã³ã®ããžãã¯ãå®è£ ã§ããŸãã ããã¯èµ·ãããŸããïŒ èª°ããããèããããšãã§ããŸããïŒ
var timeToSubmit = $.Deferred(function(def){ doneTimeout(10000).done(def.resolve); $('.submissionButton').one('click', function(){ def.resolve(); return false; }); }).promise(); timeToSubmit.done(function(){ // // });
ããŒãžèŠçŽ ã®ã¢ãã¡ãŒã·ã§ã³ãçµäºãã
ãµãŒããŒããããŒã¿ãå°çããæç¹ã§ã¯ãªãããããã¢ããã¡ãã»ãŒãžã§ããããæ éã«è¡šç€ºããŠãããã®ã¡ãã»ãŒãžãæ¶ããšãã«ãããã»ã¹ãå®äºããããšãèæ ®ããå¿ èŠãããå ŽåããããŸãã ãã¡ããã次ã®ããã«ãã³ãã«ãäœæã§ããŸãïŒããã¯ãããŒãã®æåŸã«ãããªã³ã¯ã®1ã€ã䜿çšããä¿®æ£ãããäŸã§ãïŒã
function animationPromise($element){ return $.Deferred(function(def){ $element.fadeIn( 10000 , def.resolve ); }).promise(); }
ãã ããããã¯å®å šã«äžèŠã§ãã åjQueryèŠçŽ ã¯promiseïŒïŒåŒã³åºãããµããŒãããã¢ãã¡ãŒã·ã§ã³ãçµäºããpromiseãè¿ããŸãïŒ
function animationPromise($element){ return $element.fadeIn( 10000 ).promise(); }
次ã®ããã«ãã¢ãã¡ãŒã·ã§ã³ã®æåŸãŸã§ãèããããšãã§ããŸãã
animationPromise($('#foo')).done(function(){ console.log('Animation is finished'); });
ãŸãã¯åã«ïŒ
$element.fadeIn( 10000 ).promise().done(function(){ console.log('Animation is finished'); });
ãã®æ¹æ³ã§ãããã¢ãã¡ãŒã·ã§ã³ãå¥ã®ã¢ãã¡ãŒã·ã§ã³ã«ãçŽä»ããããªãããšãå¿ããªãã§ãã ããã ããã«ã¯ãããç°¡æœã§å®æçãªæ¹æ³ããããŸãã
$element.fadeIn( 10000 ).fadeOut( 10000 );
ã¢ãŒãã«ãã€ã¢ãã°ã®ç¶æ
ããŒãžã€ã³ã¿ãŒãã§ã€ã¹ãšã®ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãæ¹åããã©ã€ãã©ãªã®äŸã¯æ°å€ããããŸãããããã°ã©ããŒã®ããšãå¿ããããšããããŸãã
äŸã¯ãTwitter Bootstrapã®ã¢ãŒãã«ãŠã£ã³ããŠã®å®è£ ã§ãïŒ ãã¡ããåç § ïŒã ã衚瀺ããšãé衚瀺ããããŠã£ã³ããŠãéããŠããããããŠã£ã³ããŠãé ããŠããããšããã€ãã³ãããããŸãã ããããããã°ã©ããŒã¯ããã®ãŠã£ã³ããŠã§ãŠãŒã¶ãŒãã©ã®ãããªéžæãããããã©ã®ããã«ããŠèŠã€ããããšãã§ããŸããïŒ ã€ãŸãã©ã®ãªã³ã¯ããã¿ã³ã䜿çšããã®ã§ã¯ãªããã¢ã¯ã·ã§ã³ã§äœãèšã£ãã®ã§ããããïŒåœŒã®éžæã¯ãèšç»ãããããã»ã¹ã®æ£åžžãªå®äºãŸãã¯ãã£ã³ã»ã«ã«ã€ãªãããŸãããïŒããšãã°ããã€ã¢ãã°ããã¯ã¹ã¯ããã£ã³ã»ã«ãã¿ã³ã§éããããšãã§ããäžéšã«ååãããããŠã£ã³ããŠã®åšå²ã®èæ¯ãã¯ãªãã¯ããããšãã§ããŸãããããã¯ãã€ã¢ãã°ã§æäŸãããæäœãéæããŠããªããšè§£éã§ããŸãã
ãã¡ããããã®ãããã¯ã圌ã«è¿ãå Žåã¯ãèªè ã«Twitter Bootstrapã¢ãŒãã«ãŠã£ã³ããŠã©ãããŒã®ç¬èªã®å®è£ ã«ã€ããŠèããããšããå§ãããŸãããããŠãç§èªèº«ã®äŸãå¥ã®æ©äŒã«æããŸãããã
è€æ°ã®ããã»ã¹ã®æåŸ ãçµã¿åããã
è€æ°ã®ä¿çäžã®ããã»ã¹ã®æåŸ ãçµã¿åãããå¿ èŠãããããšã¯æããã§ããäžèšã§ã¯ãã¿ã€ã ã¢ãŠããŸãã¯ãã¿ã³ãæŒããšãã2ã€ã®ç¶æ ã®ããããã®è¿ éãªéå§ãåŸ ã€äŸãæ€èšããŸãããããã€ãã®ã€ãã³ããçºçããããšèªäœãã€ãã³ãã«ãªãããã®çµæããã®ã³ã³ããŒãã³ãã®çµæã«äŸåãããå€ãã®åæ§ã®ç¶æ³ããããŸãã
人æ掟é£jQueryã®ç³ãåºãã¡ãæ³
$.when()
åãå ¥ããçŽæãããæ°ããäžãçŽæå圌ã®çŽæã®ã³ã³ããŒãã³ããããã³æ éãæ£åžžã«å®äºããããšãå®æããããšã«ãªã£ãŠããæåãã¡ã«ã -ããããã®å°ãªããšãäžæ¹ã®æ éãããã¯äžçš®ã®è«çæŒç®Iã§ãããã¹ãŠã®ãªãã©ã³ããTRUEã§ããå Žåã«ã®ã¿åºåãTRUEïŒ=æåïŒã«ãªãããã以å€ã®å Žåã¯FALSEïŒ=倱æïŒã«ãªããŸãã
èŠãŠã®ãšãããè«çORã®é¡äŒŒç©ã§ã¯äžååã§ãã ã€ãŸãçŽæãçµã¿åããããã®ãããªæ¹æ³ã¯ããã¹ãŠã®çŽæã倱æããå Žåã«ã®ã¿ãæäœã®å€±æãéç¥ããŸãããŸããä»ã®å Žåãæäœã¯æ£åžžã«çµäºããŸãã
ããã§ããã®ãããªå®è£ ã®ç¬èªã®ã¹ã±ããã瀺ããŸãã
// fail if and only if all fail: function failIifAllFail(_promise_array){ var promises = [].slice.apply(arguments), count = promises.length; return $.Deferred(function(def){ // var done = 0, fail = 0; // // check() , // $.each(promises, function wrap(key, p){ p.done(function(){ done++; check(); }).fail(function(){ fail++; check(); }); }); function check(){ if ((done + fail) < count) return; if (fail === count) def.resolve(); else def.reject(); } }).promise(); }
é·æå®è¡ã³ã³ãã¥ãŒãã£ã³ã°å¶åŸ¡
ç¶ç¶çãªã³ã³ãã¥ãŒãã£ã³ã°-åºããã人ã¯ç¢ºèªãã-ç¹å¥ãªã¢ãããŒããå¿ èŠã§ããèšç®å埩åãåŒã³åºããããµã€ã¯ã«ãè£è¿ããå埩åãç¡å¹ã«ããã¿ã€ã ã¢ãŠãã䜿çšããŠããã°ããå®è¡ãåŒã³åºããçµæãåŸããããŸã§åŒã³åºããç¹°ãè¿ããŸããããã»ã¹ãæ£ç¢ºã«ãã€çµäºãããã¯ãããã«ã¯ããããŸãããçŽæãé©çšããå¯èœæ§ããããŸãã
èªè ãå®è£ ã«ã€ããŠèªåã§èãã次ã«äœãèµ·ããããå¥ã®ã¡ã¢ã§æ¯èŒããããšããå§ãããŸãã
ãæž èŽããããšãããããŸããïŒ
é¢é£ããé¢é£ãªã³ã¯
- å ç©ãšçŽæ-ãŠã£ãããã£ã¢ã®èšäº
- HabrïŒjQuery 1.5ã§ã®é 延ãªããžã§ã¯ãã®äœ¿çš -1.02.2011 ããã®ç¿»èš³
- HabrïŒ$ .Deferredãªããžã§ã¯ãã䜿çšãããã¹ãã®ååž°ä¿å-èšäº2.12.2013
- : Deferred/Promise â 27.09.2013
- You're Missing the Point of Promises â 14.10.2012
- : Promise pattern, Jul 08, 2012
- : JavaScript Patterns and Principles, May 03, 2013