jQuery.when()【状態判定】
メモ
- 指定オブジェクトの状態を判定し、状態が設定された Promise オブジェクトを返却
指定オブジェクトにより下記の処理- 無し:成功状態の Promise オブジェクトを返却 ( 例1 参照)
- Deferred オブジェクトのみ:そのサブセットの Promise オブジェクトを返却 ( 例1 参照)
- Deferred オブジェクト・Promise オブジェクト 以外のみ:成功状態の Promise オブジェクトを返却 ( 例1 参照)
- 複数の Deferred オブジェクト:Deferred オブジェクトを新規生成 (マスター) しそのサブセットの Promise オブジェクトを返却、状態は下記 ( 例2 参照)
全て成功状態:成功状態
1つでも失敗状態:失敗状態
- 返却された Promise オブジェクトのハンドラのパラメータ ( 例2 参照)
- 成功処理ハンドラ:$when() の指定オブジェクト順
個々のパラメータは1つに集約 (パラメータ無し:undefined / 1個のパラメータ:そのまま / 複数パラメータ:配列変換) - 失敗処理ハンドラ:失敗状態のオブジェクトのパラメータ
- 成功処理ハンドラ:$when() の指定オブジェクト順
- 下記の組み合わせで、次の様な記述が可能 ( 例3 参照)
- deferred.then()【《Deferred 成功処理・失敗処理・状態通知》ハンドラ追加】 (戻り値:Promise オブジェクト)
- deferred.catch()【《Deferred 失敗処理》ハンドラ追加】 (戻り値:Promise オブジェクト)
$.when( ~ ) .then( ~ ) ... .then( ~ ) .catch( ~ );
- 非同期処理の並行実行については、状態管理・非同期処理 (Deferred Object) 参照
構文
関連
例
【例1】
<p id="output1" style="border:1px black solid; padding:1px 5px;">【出力】</p>
<script>
var doneCallback1 = function() { $("#output1").append("<br>done1"); };
var failCallback1 = function() { $("#output1").append("<br>fail1"); };
// パラメータ無し
$.when().then(doneCallback1, failCallback1);
var doneCallback2 = function(p1) { $("#output1").append("<br>done2 " + p1); };
var failCallback2 = function(p1) { $("#output1").append("<br>fail2 " + p1); };
// 即時成功状態
$.when(123).then(doneCallback2, failCallback2);
// 成功状態
var df1 = $.Deferred();
$.when(df1).then(doneCallback2, failCallback2);
df1.resolve("resolve");
// 失敗状態
var df2 = $.Deferred();
$.when(df2).then(doneCallback2, failCallback2);
df2.reject("reject");
</script>
【出力】
【例2】
<p id="output2" style="border:1px black solid; padding:1px 5px;">【出力】</p>
<script>
var doneCallback = function(p1, p2, p3) {
$("#output2").append("<br>done3 (" + p1 + ") / (" + p2 + ") / (" + p3 + ")");
};
var failCallback = function(p1, p2, p3) {
$("#output2").append("<br>fail3 (" + p1 + ") / (" + p2 + ") / (" + p3 + ")");
};
// 成功状態 (パラメータ有り)
var dfA = $.Deferred();
var dfB = $.Deferred();
var dfC = $.Deferred();
$.when(dfA, dfB, dfC).then(doneCallback, failCallback);
dfA.resolve(1, 2, 3);
dfB.resolve("resolve");
dfC.resolve( );
// 失敗状態 (パラメータ有り)
var dfX = $.Deferred();
var dfY = $.Deferred();
var dfZ = $.Deferred();
$.when(dfX, dfY, dfZ).then(doneCallback, failCallback);
dfX.resolve(1, 2, 3);
dfY.reject(4, 5, 6);
</script>
【出力】
【例3】
<p id="output3" style="border:1px black solid; padding:1px 5px;">【出力】</p>
<script>
var doneCallback1 = function() { $("#output3").append("<br>done (1)"); };
var doneCallback2 = function() { $("#output3").append("<br>done (2)"); };
var doneCallback3 = function() { $("#output3").append("<br>done (3)"); };
var failCallback = function() { $("#output3").append("<br><br>fail"); };
// 成功状態 (メソッドチェーン)
var dfA = $.Deferred();
var dfB = $.Deferred();
var dfC = $.Deferred();
$.when(dfA, dfB, dfC)
.then(doneCallback1)
.then(doneCallback2)
.then(doneCallback3)
.catch(failCallback);
dfA.resolve();
dfB.resolve();
dfC.resolve();
// 失敗状態 (メソッドチェーン)
var dfX = $.Deferred();
var dfY = $.Deferred();
var dfZ = $.Deferred();
$.when(dfX, dfY, dfZ)
.then(doneCallback1)
.then(doneCallback2)
.then(doneCallback3)
.catch(failCallback);
dfY.reject();
</script>
【出力】