如何根据用户输入解决JQuery承诺

时间:2016-04-11 15:20:16

标签: jquery promise bootbox

我有这段代码,其结果应作为已解决或拒绝的承诺返回。

runClickIdCheck()

函数runMaxClicksCheck()true收集用户输入并根据它返回falsetrue。如果两个结果值都是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,则可以解决此承诺。

1 个答案:

答案 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
            });
        });
    });
});