可以调用或不调用多个AJAX调用然后执行函数

时间:2017-02-24 21:53:40

标签: javascript c# jquery ajax razor

我正在使用C#和jQuery来构建表单页面,我有多个输入,如果它们已经填充,我想向附加的SQL Server提交一个AJAX调用,如果它们没有填充我想要没做什么。 一旦所有填充的AJAX调用完成,我就想重新加载页面。

现在我有这样的功能:

Func1()
{
   if ($'#form1').val().length > 0 {
   $.post('https://foo/', {id: id, column: col1, value: $('form1').val())
   }

   if ($'#form2').val().length > 0 {
   $.post('https://foo/', {id: id, column: col1, value: $('form2').val())
   }
}

$('#submit').click(function() {
  Func1();
  window.location.reload(true);
} );

然而,这会导致一些值被更新但不是全部,我知道这与我的异步调用有关。我对异步调用相当新,但通常我会放一个.then(function(){});在他们的最后,他们工作正常,但在这种情况下,它没有解决任何问题。有人能指出我正确的资源方向来解决这个问题吗?我无法嵌套我的AJAX调用,因为有时2会更新,1会不会。

3 个答案:

答案 0 :(得分:1)

根据您的要求,您可以通过对代码的轻微重组来实现它:

  function form1CallAsync(){
      var d = $.Deferred();
      if ($'#form1').val().length > 0) {
       // Ajax call for Form1 post. Important: In the success callback, have    
       //d.resolve() in the end, in the error callback, d.reject()
      } else { d.resolve(); }
      return d.promise();
    }
    function form2CallAsync(){
      var d = $.Deferred();
      if ($'#form2').val().length > 0) {
       // Ajax call for Form2 post. Important: In the success callback, have    
       //d.resolve() in the end, in the error callback, d.reject()
      } else { d.resolve(); }
      return d.promise();
    }
    $('#submit').click(function() {   
           $.when(form1CallAsync(), form2CallAsync()).done(
                  function(a1, a2){
                       // your code to process the results from both ajax posts
                       // ..
                       window.location.reload(true);
                  }
           )
     });

答案 1 :(得分:0)

我能想到一个解决方案。可能有更好的解决方案。

1)用false声明两个布尔变量。

2)一旦特定呼叫成功/失败,将每个变量设置为true。

3)将窗口重新加载到文档就绪并相应地重新加载。

$(document).ready(function(){     
  if (callOne == true && calltwo == true){
 window.location.reload(true);
 }    
}

答案 2 :(得分:0)

看一下优雅的jQuery When

使用上面的代码,可以将代码重写为:

$('#submit').click(function() {
   if (($'#form1').val().length > 0 && ($'#form2').val().length > 0) {
       $.when($.post(*form1Call*), $.post(*form2Call*)).done(
              function(a1, a2){
                   // your code to process the results from both ajax posts
                   // ..
                   window.location.reload(true);
              }
       )
   }      
 });