Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 作用于两个异步函数调用的结果_Javascript_Jquery_Asynchronous - Fatal编程技术网

Javascript 作用于两个异步函数调用的结果

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

当且仅当对异步函数的两个调用返回false时,我想提交表单

这是简化代码:

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()