簡體   English   中英

如何根據用戶輸入解析JQuery Promise

[英]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()收集用戶輸入,並基於該輸入返回truefalse 如果兩個結果值都為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()評估為truerunMaxClicksCheck()解決承諾。

盡管可以使用$.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM