Ajaxの勉強中にDeferredを用いることで直列処理が可能になり、ajaxの戻り値にはDeferredが含まれていることを知りました。
そこで、次のような処理を試してみたのですが期待する動作は得られませんでした。
hoge1のAjax処理後にhoge2を実行し、最終的に何かしらメッセージを画面に表示するという処理です。
ここでalways()で表示するためのメッセージを直前のresolve()で渡しているのにもかかわらず、always()に受け渡されるのはjqXHRオブジェクトのためメッセージを表示することができません。
どのように修正したら良いかご教授いただければ幸いです。
追記
やりたいこととしては、hoge2が取得したデータをalwaysで表示したいです。
ただしhoge2がデータの取得を行うためにはhoge1で取得したデータが必要です。
また、hoge1、hoge2は実際にはajaxでwebサーバに業務ロジックを依頼し、業務ロジックの成功可否をajaxのデータに値を返します。
ここで、hoge1もしくはhoge2でajaxの通信エラーやタイムアウトなどのエラーが発生した場合はalwaysで表示するメッセージをfailで設定します。
また、hoge1もしくはhoge2で依頼した業務ロジックの成功可否をifで判定します。
失敗だった場合はifブロックの中でalwaysに表示するメッセージを設定した後、処理を以降の処理を中断し、alwaysを実行させています。
なので、結果的にalwaysで表示されるのは、下のいずれかだと思うのですが、Ajaxのエラーのみ正しく表示されます。
なので、期待通りであれば下記のメッセージが表示されます。
・hoge2がajaxで取得したデータ
・「Ajaxエラー」
・「hoge1の業務ロジックエラー」
・「hoge2の業務ロジックエラー」
javascript
1function btnOnClick() { 2 hoge1() 3 .then(function (data, status, xhr) { 4 var def = new $.Deferred(); 5 6 if (!data) { 7 8 // do something 9 10 def.resolve('hoge1の業務ロジックエラー'); 11 return def.promise(); 12 } 13 14 // do something 15 16 return hoge2(data) 17 .then(function (data, status, xhr) { 18 var def = new $.Deferred(); 19 20 if (!data) { 21 22 // do something 23 24 def.resolve('hoge2の業務ロジックエラー'); 25 return def.promise(); 26 } 27 28 // do something 29 30 def.resolve(data); 31 return def.promise(); 32 }); 33 }).fail(function (xhr, status, errorThrown) { 34 var def = new $.Deferred(); 35 def.resolve('Ajaxエラー' + status); 36 return def.promise(); 37 }).always(function (message) { 38 alert(message); 39 }); 40} 41 42var hoge1 = function () { 43 return $.ajax({ 44 url: './hoge1.html', 45 timeout: 1000 46 }); 47} 48 49var hoge2 = function (data) { 50 return $.ajax({ 51 url: './hoge2.html', 52 timeout: 1000, 53 data: data 54 }); 55}
補足情報(FW/ツールのバージョンなど)
IE11
ECMAScript 5
jquery-2.2.4