[英]How to resolve a JQuery promise based on the user input
我有这段代码,其结果应作为已解决或已拒绝的承诺返回。
var runChecks = function(hasClickId, maxClicksModeIsNotOff) {
var dfd = $.Deferred();
clickIdCheckPassed = hasClickId; // equals false
maxClicksCheckPassed = maxClicksModeIsNotOff; // equals false
if (!clickIdCheckPassed) {
clickIdCheckPassed = runClickIdCheck();
}
if (!maxClicksCheckPassed) {
maxClicksCheckPassed = runMaxClicksCheck();
}
if (maxClicksCheckPassed && clickIdCheckPassed) {
dfd.resolve('Resolved');
} else {
dfd.reject('rejected');
}
return dfd.promise();
};
函数runClickIdCheck()
和runMaxClicksCheck()
收集用户输入,并基于该输入返回true
或false
。 如果两个结果值都为true
,则我应解决诺言,否则应将其拒绝-因此有条件的:
if (maxClicksCheckPassed && clickIdCheckPassed) {
dfd.resolve('Resolved');
} else {
dfd.reject('Rejected');
}
但是,问题在于该代码不等待用户输入,并且每次甚至在用户给出任何输入之前,都将承诺评估为“已拒绝”。
供参考,这是runClickIdCheck
函数的外观:
var runClickIdCheck = function() {
bootbox.confirm('Are you sure?', function(result) {
if (result) {
return true;
}
});
return false;
};
如何使此代码按预期方式运行,以便仅在依赖于用户输入的函数都返回true时,评估对“解决”的承诺?
编辑:
预期的UI行为是仅当用户两次确认对话时才应提交表单:
$form.submit(function(e) {
e.preventDefault();
$.when(runChecks(hasClickId, maxClicksModeIsNotOff)).then(
function(status) {
$form.submit()
},
function(status) {
return false;
}
);
}
这就是为什么我认为Promise接口会完成这项工作的原因。 如果runClickIdCheck()
和runMaxClicksCheck()
评估为true
, runMaxClicksCheck()
解决承诺。
尽管可以使用$.Deferred()
使其工作,但我怀疑是否值得。
在编写下面的代码之前,我已经实现了一个基于bootbox
的解决方案,结果证明,与仅使用bootbox
提供的基于回调的方法相比, 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
});
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.