我有这段代码,其结果应作为已解决或拒绝的承诺返回。
runClickIdCheck()
函数runMaxClicksCheck()
和true
收集用户输入并根据它返回false
或true
。如果两个结果值都是if (maxClicksCheckPassed && clickIdCheckPassed) {
dfd.resolve('Resolved');
} else {
dfd.reject('Rejected');
}
,我应该解决这个承诺,否则它应该被拒绝 - 因此条件:
runClickIdCheck
然而,问题是代码不会等待用户输入,并且每次在用户提供任何输入之前将promise视为“已拒绝”。
作为参考,这就是var runClickIdCheck = function() {
bootbox.confirm('Are you sure?', function(result) {
if (result) {
return true;
}
});
return false;
};
函数的样子:
$form.submit(function(e) {
e.preventDefault();
$.when(runChecks(hasClickId, maxClicksModeIsNotOff)).then(
function(status) {
$form.submit()
},
function(status) {
return false;
}
);
}
如何使这段代码按预期运行,以便只有当依赖于用户输入的函数都返回true时才评估“解析”的承诺?
修改
预期的UI行为是,只有当用户确认对话两次时才应提交表单:
runClickIdCheck()
这就是为什么我认为承诺接口会完成这项工作。如果runMaxClicksCheck()
和true
评估为Function
,则可以解决此承诺。
答案 0 :(得分:1)
虽然可能使$.Deferred()
能够使用,但我怀疑这是值得的。
在编写以下代码之前,我已经实现了一个基于promise的解决方案,结果比使用bootbox
提供的基于回调的方法要长得多,而且不太明确。
保持简单。
$("#form").submit(function (e) {
var self = this;
e.preventDefault();
bootbox.confirm('Question 1', function (confirmed1) {
if (!confirmed1) return;
bootbox.confirm('Question 2', function (confirmed2) {
if (!confirmed2) return;
$.post(self.action, $(self).serialize()).done(function (data) {
// Ajax post has finished successfully
});
});
});
});