我正在尝试将序列化逻辑强制到网页上的一组异步活动上。我相当确定我想使用 jQuery 延迟对象,但我遇到了一个问题,即我想要执行的函数取决于用户何时决定通过单击各种按钮进行选择。我正在使用以下 jsFiddle 想法寻求帮助:
考虑一系列 4 个按钮。单击时,每个按钮都会禁用自身并启用下一个按钮。每个按钮在启用之前不应设置其事件。只有在启用第三个按钮后,才能完成一个附加任务(在这种情况下是一个警报)。
基本 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 步中的附加任务会在页面加载时触发。我需要如何调整此场景的控制或逻辑以解决每个步骤,直到注册了相应的按钮按下?