é 延ãªããžã§ã¯ãã¯$ .ajaxïŒïŒã«åã蟌ãŸããããã«ãªã£ããããèªåçã«åãåããŸãã 次ã®ããã«ããã³ãã©ãŒãçµæã«é¢é£ä»ããããšãã§ããŸãã
// $.get, ajax , var req = $.get('foo.htm') .success(function( response ){ // - }) .error(function(){ // - }); // $.get() doSomethingAwesome(); // - req.success(function( response ){ // - // , , // });
åäžã®æåããšã©ãŒããŸãã¯å®äºãã³ãã©ãŒã«å¶éãããªããªããŸãã;åçŽãªã³ãŒã«ããã¯é¢æ°ã®ä»£ããã«ãèªå·±çµç¹åã³ãŒã«ããã¯ãã¥ãŒïŒFIFOïŒããããŸãã
äžèšã®äŸã«ç€ºãããã«ãã³ãŒã«ããã¯ã¯ãAJAXèŠæ±ã®åŸããŸãã¯ã¿ã¹ã¯ã®å®äºåŸã§ãããã¯ã§ããŸãã ããã¯ã³ãŒããæŽçããã®ã«æé©ã§ã;é·ãã³ãŒã«ããã¯ãããã¯ã®æ¥ã¯çªå·ãä»ããããŸãã
ããæ·±ãæãäžããŠãããã€ãã®åæAJAXãªã¯ãšã¹ãã®åŸã«é¢æ°ãåŒã³åºãããç¶æ³ãæ³åããŠãã ããã ããã¯ãé 延ãªããžã§ã¯ããã«ããŒ-$ .whenïŒïŒã䜿çšãããšç°¡åã§ãã
function doAjax(){ return $.get('foo.htm'); } function doMoreAjax(){ return $.get('bar.htm'); } $.when( doAjax(), doMoreAjax() ) .then(function(){ console.log( 'I fire once BOTH ajax requests have completed!' ); }) .fail(function(){ console.log( 'I fire if one or more requests failed.' ); });
JsFiddleã®äŸjsfiddle.net/ehynds/Mrqf8
ããã¯ããã¹ãŠã®jQuery AJAXã¡ãœããããéåæåŒã³åºãã远跡ããããã«äœ¿çšãããPromiseãªããžã§ã¯ããå«ããªããžã§ã¯ããè¿ãããããã¹ãŠæ©èœããŸãã Promiseã¯ãã¢ã¯ã·ã§ã³ã®çµæã®èªã¿åãå¯èœãªãªãã¶ãŒããŒã§ãã é 延ãªããžã§ã¯ãã¯ãpromiseïŒïŒã¡ãœããã®å¯çšæ§ã調ã¹ãŠããªããžã§ã¯ããç£èŠã§ãããã©ããïŒãªããžã§ã¯ããç£èŠå¯èœãã©ããïŒãå€æããŸãã $ .whenïŒïŒã¯ããã¹ãŠã®AJAXãªã¯ãšã¹ãã®å®è¡ãåŸ æ©ããŸãããããçºçãããšã.thenïŒïŒããã³.failïŒïŒãä»ããŠ$ .whenïŒïŒã«ã¢ã¿ãããããã³ãŒã«ããã¯é¢æ°ãã¿ã¹ã¯ã®çµæã«å¿ããŠåŒã³åºãããŸãã ã³ãŒã«ããã¯é¢æ°ã¯ãå°çé ã«åŒã³åºãããŸãïŒFIFOãã¥ãŒïŒã
ãã¹ãŠã®é 延ã¡ãœããïŒ.thenïŒïŒããã³.failïŒïŒïŒã¯é¢æ°ãŸãã¯é¢æ°ã®é åãåãå ¥ãããããç¬èªã®åäœãäœæãã1åã®åŒã³åºãã§ãã¹ãŠå²ãåœãŠãããå¿ èŠã«å¿ããŠããããåé¢ãããã§ããŸãã
$ .ajaxïŒïŒã¯ãå¥ã®Deferredã®ãããªãªããžã§ã¯ããå«ãéæšæºãªããžã§ã¯ããè¿ããŸãã çŽæïŒïŒã«ã€ããŠã¯ãã§ã«èª¬æããŸãããããã®å ŽåïŒïŒãæåïŒïŒããšã©ãŒïŒïŒãªã©ãèŠã€ãããŸããã Ajax-Deferredãªããžã§ã¯ãå šäœã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã promiseïŒïŒãã³ãŒã«ããã¯ã¡ãœãããããã³isRejectedïŒïŒããã³isResolvedïŒïŒã¡ãœããã®ã¿ããããã¯Deferredãªããžã§ã¯ãã®ã¹ããŒã¿ã¹ã確èªããããã«äœ¿çšã§ããŸãã
ãããããªããªããžã§ã¯ãå šäœãè¿ããªãã®ã§ããããïŒ ãã®å ŽåãAjaxã®å¿çãåŸ ã€ããšãªããããã°ã©ã ã§Ajax-Deferredãªããžã§ã¯ããå®æãããããšãã§ããŸãã ããã¯æœåšçã«ãã©ãã€ã å šäœã«éåããŸãã
ã³ãŒã«ããã¯ãç»é²ãã
äžèšã®äŸã§ã¯ãdeferredãªããžã§ã¯ãã«ã³ãŒã«ããã¯é¢æ°ãç»é²ããããã«thenïŒïŒãsuccessïŒïŒãããã³failïŒïŒã¡ãœããã䜿çšãããŠããŸãããç¹ã«Ajax-Deferredã䜿çšããå Žåã¯ãããã«å€ãã®ã¡ãœããã䜿çšã§ããŸãã
ã¡ãœããã¯ãã¹ãŠã®Deferredãªããžã§ã¯ãïŒAJAXã$ .whenããã³æåã§äœæããããã®ïŒã§äœ¿çšã§ããŸãã
.then( doneCallbacks, failedCallbacks ) .done( doneCallbacks ) .fail( failCallbacks )
Ajax-Deferredãªããžã§ã¯ãã«ã¯ãäžèšã®ã¡ãœãããåçŽã«è€è£œãã3ã€ã®è¿œå ã¡ãœããããããŸãã ãããã¯ã»ãã³ãã£ãã¯ã®ä»£æ¿æ段ãæäŸããç§ãã¡å šå¡ãæ £ããŠããå€ããã³ãã©ãŒãšååã䌌ãŠããŸãïŒ
.complete( doneCallbacks, failCallbacks ) .success( doneCallbacks ) .error( failCallbacks )
ãããã£ãŠã次ã®3ã€ã®äŸã¯åçã§ãïŒæåã¯ãAJAXãªã¯ãšã¹ãã®ã³ã³ããã¹ãã«ããå Žåãããèªã¿åããåªããŠããŸãããïŒïŒ
$.get("/foo/").done( fn ); // : $.get("/foo/").success( fn ); // : $.get("/foo/", fn );
é 延åäœãäœæãã
$ .ajaxããã³$ .whenã¡ãœããã¯å éšçã«é 延APIãæäŸããããšãç¥ã£ãŠããŸãããç¬èªã®ããŒãžã§ã³ãäœæããããšãã§ããŸãã
function getData(){ return $.get('/foo/'); } function showDiv(){ var dfd = $.Deferred(); $('#foo').fadeIn( 1000, dfd.resolve ); return dfd.promise(); } $.when( getData(), showDiv() ) .then(function( ajaxResult ){ console.log('The animation AND the AJAX request are both done!'); // 'ajaxResult' });
JsFiddleã®äŸjsfiddle.net/ehynds/JSw5y
showDivïŒïŒå ã§ãã¢ãã¡ãŒã·ã§ã³ãå®è¡ããŠãããã¹ãè¿ãæ°ããDeferredãªããžã§ã¯ããäœæããŸãã fadeInïŒïŒãå®äºããåŸãé 延å®äºïŒjQueryã®ãã¥ãŒã¡ãœããã«ç²ŸéããŠããå Žåã¯dequeueïŒïŒãå¿ããªãã§ãã ããïŒã promiseãæ»ã£ãŠDeferredãçµäºãããŸã§ã®éã«ãäž¡æ¹ã®ã¿ã¹ã¯ãæ£åžžã«å®äºãããŸã§åŸ æ©ããã³ãŒã«ããã¯ãç»é²ããŸãã ãããã£ãŠãäž¡æ¹ã®ã¿ã¹ã¯ãå®äºãããšãã³ãŒã«ããã¯ãå®è¡ãããŸãã
getDataïŒïŒã¯ã$ .whenïŒïŒãã¢ã¯ã·ã§ã³ã®é²è¡ç¶æ³ãç£èŠã§ããããã«ããpromiseã¡ãœãããæã€ãªããžã§ã¯ããè¿ããŸãã åæ§ã®ãªããžã§ã¯ãã¯showDivïŒïŒãè¿ããŸã
é 延ãªããžã§ã¯ã
getDataïŒïŒããã³showDivïŒïŒã§åã ã®ã³ãŒã«ããã¯é¢æ°ãç»é²ãã1ã€ã®master-Deferredãªããžã§ã¯ãã«ãããã®ãããã¹ãç»é²ããããã®å¥ã®ã¹ããããå®è¡ã§ããŸãã
æåããgetDataïŒïŒãŸãã¯æåããshowDivïŒïŒãåå¥ã«å®è¡ããåŸãããã³getDataïŒïŒãšshowDivïŒïŒã®äž¡æ¹ã®æååŸã«äœããå®è¡ãããå Žåã¯ãåã ã®Deferredãªããžã§ã¯ãã®ã³ãŒã«ããã¯ãç»é²ãã $ .when
function getData(){ return $.get('/foo/').success(function(){ console.log('Fires after the AJAX request succeeds'); }); } function showDiv(){ var dfd = $.Deferred(); dfd.done(function(){ console.log('Fires after the animation succeeds'); }); $('#foo').fadeIn( 1000, dfd.resolve ); return dfd.promise(); } $.when( getData(), showDiv() ) .then(function( ajaxResult ){ console.log('Fires after BOTH showDiv() AND the AJAX request succeed!'); // 'ajaxResult' is the server's response });
JsFiddleã®äŸjsfiddle.net/ehynds/W3cQc
é 延ãã§ãŒã³
Promiseã¯ã³ãŒã«ããã¯ã¡ãœããããè¿ããããããé 延ã³ãŒã«ããã¯ã¯ãã§ãŒã³ãšããŠè¡šãããšãã§ããŸãã @ajpianoã®å®éã®äŸã次ã«ç€ºããŸãã
function saveContact( row ){ var form = $.tmpl(templates["contact-form"]), valid = true, messages = [], dfd = $.Deferred(); /* bunch of client-side validation here */ if( !valid ){ dfd.resolve({ success: false, errors: messages }); } else { form.ajaxSubmit({ dataType: "json", success: dfd.resolve, error: dfd.reject }); } return dfd.promise(); }; saveContact( row ) .then(function(response){ if( response.success ){ // saving worked; rejoice } else { // client-side validation failed // output the contents of response.errors } }) .fail(function(err) { // AJAX request failed });
saveContactïŒïŒé¢æ°ã¯ããã©ãŒã ãæ€èšŒããçµæãæå¹ãªå€æ°ã«ä¿åããŸãã æ€èšŒã«å€±æããå Žåãé 延ããŒã«å€ãšãšã©ãŒé åãå«ããªããžã§ã¯ãã§é 延ãªããžã§ã¯ããçµäºããŸãã ãã©ãŒã ãæ€èšŒã«åæ Œããå Žåãé 延ãªããžã§ã¯ãã¯çµäºããŸãããä»åã¯AJAXãªã¯ãšã¹ãããã®å¿çã§çµäºããŸãã failïŒïŒãã³ãã©ãŒã¯ãã©ã³ã¹ããŒããšã©ãŒïŒ404ã500ãªã©ïŒããªãã¹ã³ããŸã
芳å¯ã§ããªãã¿ã¹ã¯
é 延ã¯ãå®è¡ããžãã¯ãéåæã§ããå Žåãšéåæã§ãªãå Žåããããã¡ã€ã³ã³ãŒããããã®æ¡ä»¶ãæœè±¡åããå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã ã¿ã¹ã¯ã¯ãããã¹ãè¿ãå ŽåããããŸãããæååããªããžã§ã¯ãããŸãã¯ä»ã®äœããè¿ãå ŽåããããŸãã
ãã®äŸã§ã¯ããã¢ããªã±ãŒã·ã§ã³ã®èµ·åããªã³ã¯ãåããŠã¯ãªãã¯ãããšãAJAXãªã¯ãšã¹ãã¯ãµãŒããŒã«çŸåšã®ã¿ã€ã ã¹ã¿ã³ããä¿åããŠè¿ãããã«æ瀺ããŸãã ã¿ã€ã ã¹ã¿ã³ãã¯ãAJAXãªã¯ãšã¹ãã®å®è¡åŸã«èŠçŽ ã®ããŒã¿ãã£ãã·ã¥ã«ä¿åãããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯æåã®ã¯ãªãã¯ã®ã¿ãèæ ®ããŸãã ãã®åŸã®ã¯ãªãã¯ã§ã¯ãã¿ã€ã ã¹ã¿ã³ãã¯ãµãŒããŒã«ãªã¯ãšã¹ããã代ããã«ãããŒã¿ãã£ãã·ã¥ããååŸãããŸãã
function startTask( element ){ var timestamp = $.data( element, 'timestamp' ); if( timestamp ){ return timestamp; } else { return $.get('/start-task/').success(function( timestamp ){ $.data( element, 'timestamp', timestamp ); }); } } $('#launchApplication').bind('click', function( event ){ event.preventDefault(); $.when( startTask(this) ).done(function( timestamp ){ $('#status').html( '<p>You first started this task on: ' + timestamp + '</p>'); }); loadApplication(); });
$ .whenïŒïŒããã®æåã®åŒæ°ã«çŽæããªãïŒãããã£ãŠã芳枬ã§ããªãïŒããšãèªèãããšãæ°ããé 延ãªããžã§ã¯ããäœæããããŒã¿ãªããžã§ã¯ãã§çµäºãããã®é 延ãªããžã§ã¯ãã®çŽæãè¿ããŸãã ãã®ãããçŽæã®ãªããªããžã§ã¯ãã¯èŠ³å¯å¯èœã«ãªããŸãã
1ã€å°ããªããšã§ãããpromiseã¡ãœããã§ãªããžã§ã¯ããè¿ããªããžã§ã¯ãã®èµ·åãé ãããããšã¯ã§ããŸããã é 延ãªããžã§ã¯ãã¯promiseã¡ãœããã®å¯çšæ§ã«ãã£ãŠæ±ºãŸããŸãããjQueryã¯promiseãå¿ èŠãªãªããžã§ã¯ããè¿ããã©ããããã§ãã¯ããŸããã ãããã£ãŠããã®ã³ãŒãã«ã¯æ§æãšã©ãŒãå«ãŸããŠããŸãã
var obj = { promise: function(){ // do something } }; $.when( obj ).then( fn );
ãããã«
é 延ãªããžã§ã¯ãã¯ãéåæã¿ã¹ã¯ãèšè¿°ããããã®æ°ããä¿¡é Œã§ããæ¹æ³ãå°å ¥ããŸãã ã³ãŒã«ããã¯ããžãã¯ã1ã€ã®ã³ãŒã«ããã¯ã«æŽçããæ¹æ³ã«çŠç¹ãåœãŠã代ããã«ãããã€ãã®åå¥ã®ã¢ã¯ã·ã§ã³ãã³ãŒã«ããã¯ãã¥ãŒã«å²ãåœãŠãŠããããã®åæãããŸãæ°ã«ããã«å®è¡ãããããšãèªèã§ããŸãã ææ¡ãããæ å ±ã¯é·ãéãã€ãžã§ã¹ãããå¿ èŠããããŸããããã¹ãŠãåŠã¶ãšãDeferredãªããžã§ã¯ãã䜿çšãããšéåæã³ãŒããã¯ããã«ç°¡åã«ãªãããšãç解ã§ãããšæããŸãã