Javascript 作用于两个异步函数调用的结果
当且仅当对异步函数的两个调用返回false时,我想提交表单 这是简化代码:Javascript 作用于两个异步函数调用的结果,javascript,jquery,asynchronous,Javascript,Jquery,Asynchronous,当且仅当对异步函数的两个调用返回false时,我想提交表单 这是简化代码: var firstConfirmed = false; var secondConfirmed = false; $form.submit(function(e) { e.preventDefault(); if (!firstConfirmed) { firstConfirmed = getConfirmation1(); } if (!secondConf
var firstConfirmed = false;
var secondConfirmed = false;
$form.submit(function(e) {
e.preventDefault();
if (!firstConfirmed) {
firstConfirmed = getConfirmation1();
}
if (!secondConfirmed) {
secondConfirmed = getConfirmation2()
}
**if (firstConfirmed && secondConfirmed) { // This will get evaluated before the asynchronous calls finish :(
$form.submit();
}
});
getConfirmation1()
和getConfirmation2()
是异步的:
var getConfirmation1 = function() {
bootbox.confirm('Are you sure?', function(result) {
if (result) {
return true;
} else {
return false;
}
});
};
(引导框插件只等待用户输入-确认/取消,getConfirmation2()的情况也一样。
)
问题是标有
**
的条件将立即进行计算,因此表单提交不可能发生。如何解决此问题并提交表单一次-getConfirmation1()
和getConfirmation2()
返回true
?您可以设置一个计时器,定期调用提交函数,也可以在确认对话框中再次调用提交函数
实际上,我甚至不确定你的代码是否在做你认为它在做的事情
firstConfirmed和secondConfirmed由于异步性质而从未设置。您需要的变量不在可由确认对话框设置的submit函数范围内
然后在对话框中显式设置它们
if (result) {
firstConfirmed = true;
doSubmitAgain();
}
您可以指定传入异步函数的回调函数,如下所示:
var getConfirmation1 = function(callback) {
bootbox.confirm('Are you sure?', function(result) {
return callback(!!result);
});
};
…然后定义回调函数,如下所示:
var firstConfirmed = false;
var secondConfirmed = false;
$form.submit(function(e) {
e.preventDefault();
getConfirmation1(function (isConfirmed) {
// Callback function for getConfirmation1
firstConfirmed = isConfirmed
checkConfirmed()
})
getConfirmation2(function (isConfirmed) {
// Callback function for getConfirmation2
secondConfirmed = isConfirmed
checkConfirmed()
})
});
function checkConfirmed () {
// Return if either async function has not confirmed
if (!firstConfirmed || !secondConfirmed) {
return
}
// Both confirmed!
$form.submit();
}
或者,您的特定示例可以通过不包装bootbox调用来进一步简化,如下所示:
var firstConfirmed = false;
var secondConfirmed = false;
$form.submit(function(e) {
e.preventDefault();
bootbox.confirm('Are you sure?', function(result) {
// Callback function for first bootbox dialog
firstConfirmed = !!result
checkConfirmed()
})
bootbox.confirm('Are you sure?', function(result) {
// Callback function for second bootbox dialog
secondConfirmed = !!result
checkConfirmed()
})
});
function checkConfirmed () {
// Return if either async function has not confirmed
if (!firstConfirmed || !secondConfirmed) {
return
}
// Both confirmed!
$form.submit();
}
firstConfirmed
和secondConfirmed
在submit()函数之外默认设置为false
。然而,我认为再次从对话中调用submit()
的想法将解决问题-它将依赖于监控firstconfirated
和secondconfirated
的状态,因此,在第二次调用submit()
和第二次确认时,实际的提交应该发生(第一次确认的和第二次确认的都将计算为true
)。谢谢您的帮助。我明天可以测试:)我想知道您拥有的任何库是否支持承诺?如果是这样的话,答案就相当简单了:Promise.all([getpromiseofconfimation1(),getpromiseofconfimation2())。然后(function(){$form.submit()$})
或者假设您在一个异步函数中
您也可以使用wait-Promise.all([getpromiseofconfimation1(),getpromiseofconfimation2())$form.submit()