[英]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.