Web ページの一連の非同期アクティビティにシリアル化されたロジックを強制しようとしています。jQuery deferred オブジェクトを使用したいのは確かですが、ユーザーがさまざまなボタンをクリックして選択を行うことを決定したときに、実行したい関数が依存しているという問題に遭遇します。次のjsFiddleアイデアを使用してこれを行うためのヘルプを探しています:
4 つのボタンのシーケンスを考えてみましょう。クリックすると、各ボタンが無効になり、次のボタンが有効になります。各ボタンは、有効になるまでイベントを設定しないでください。3 番目のボタンが有効になった後にのみ実行される追加のタスク (この場合はアラート) があります。
基本的な HTML コード
<button id="btn1">Click 1st</button>
<button id="btn2" disabled="disabled">Click 2nd</button>
<button id="btn3" disabled="disabled">Click 3rd</button>
<button id="btn4" disabled="disabled">Click 4th</button>
各ステップのタスク
var fnDoStageOne = function() {
$("#btn1").one("click", function(event, ui) {
$("#btn1").prop("disabled", true);
$("#btn2").prop("disabled", false);
//STAGE ONE IS ONLY DONE AFTER THIS POINT
});
};
var fnDoStageTwo = function() {
$("#btn2").one("click", function(event, ui) {
$("#btn2").prop("disabled", true);
$("#btn3").prop("disabled", false);
//STAGE TWO IS ONLY DONE AFTER THIS POINT
});
};
var fnDoStageThree = function() {
$("#btn3").one("click", function(event, ui) {
$("#btn3").prop("disabled", true);
$("#btn4").prop("disabled", false);
//STAGE THREE IS ONLY DONE AFTER THIS POINT
});
alert("Shouldn't see this if button 3 isn't active yet");
};
var fnDoStageFour = function() {
$("#btn4").one("click", function(event, ui) {
$("#btn4").prop("disabled", true);
alert("Task complete");
//STAGE FOUR IS ONLY DONE AFTER THIS POINT
});
};
不適切な制御ロジック
var oDeferredObj = $.Deferred();
oDeferredObj.then(fnDoStageOne);
oDeferredObj.then(fnDoStageTwo);
oDeferredObj.then(fnDoStageThree);
oDeferredObj.then(fnDoStageFour);
oDeferredObj.resolve();
jsfiddle はここで見ることができます: http://jsfiddle.net/sva79/
私の最初の理解は、関数を .then() 関数で deferred にチェーンできるということでした。明らかに、これは、ステップ 3 の追加タスクがページの読み込み時にトリガーされるため機能しません。適切なボタンの押下が登録されるまで、各ステップを解決するために、このシナリオの制御またはロジックをどのように調整する必要がありますか?