Ajax调用完成后执行函数

Posted

技术标签:

【中文标题】Ajax调用完成后执行函数【英文标题】:Execute function after Ajax call is complete 【发布时间】:2014-06-10 14:05:15 【问题描述】:

我是 Ajax 新手,我正在尝试在使用 for 循环时使用 Ajax。在 Ajax 调用之后,我正在运行一个函数,该函数使用在 Ajax 调用中创建的变量。该函数只执行两次。我认为 Ajax 调用可能没有足够的时间在循环开始之前进行调用。有没有办法在运行 printWithAjax() 函数之前确认 Ajax 调用? 我不希望 printWithAjax() 函数在 Ajax 调用完成之前执行。 任何帮助将不胜感激。

var id;
var vname;
function ajaxCall()
for(var q = 1; q<=10; q++)
 $.ajax(                                            
         url: 'api.php',                        
         data: 'id1='+q+'',                                                         
         dataType: 'json',
         async:false,                    
         success: function(data)          
            
            id = data[0];              
            vname = data[1];
         
      );

       printWithAjax(); 

 //end of the for statement
//end of ajax call function

【问题讨论】:

由于您使用的是asycn:false(如果可能的话,永远不要使用它),打印只会在ajax完成后执行......跨度> 但正确的解决方案是在成功回调中调用 print 函数并将 id 和 vname 作为参数传递 所以你想让 printWithAjax 为每个 ajax 调用触发一次? like jsfiddle.net/arunpjohny/yA8Zu/2 - 你是否也想确保ajax请求按顺序执行,如果没有你可以删除async:false 既然您只是传递数字 1 - 10,为什么不将一个数组或范围 (1-10) 传递给您的服务器并只进行一次 ajax 调用呢?而不是发出 10 个 ajax 请求。你也可以循环遍历数据来控制它的显示。 【参考方案1】:

试试这个代码:

var id;
var vname;
function ajaxCall()
for(var q = 1; q<=10; q++)
 $.ajax(                                            
     url: 'api.php',                        
     data: 'id1='+q+'',                                                         
     dataType: 'json',
     async:false,                    
     success: function(data)          
        
        id = data[0];              
        vname = data[1];
     ,
    complete: function (data) 
      printWithAjax(); 
     
    );

  //end of the for statement
  //end of ajax call function

“完成”函数只有在ajax“成功”后才会执行。所以尝试在“完成”时调用 printWithAjax()。这应该适合你。

【讨论】:

无论 ajax 调用成功/失败,都会执行完整的回调 错了!每次调用完成***.com/a/42229704 "async:false" 为我工作。非常感谢。【参考方案2】:

您可以使用.ajaxStop().ajaxComplete()

.ajaxComplete() 在您页面上的每个 AJAX 请求完成后触发。

$( document ).ajaxComplete(function() 
  yourFunction();
);

.ajaxStop() 在您页面上的所有 AJAX 请求完成后触发。

$( document ).ajaxStop(function() 
  yourFunction();
);

【讨论】:

不,ajaxComplete 被提早执行,实际上没用。【参考方案3】:

将 .done() 添加到您的函数中

var id;
var vname;
function ajaxCall()
for(var q = 1; q<=10; q++)
 $.ajax(                                            
         url: 'api.php',                        
         data: 'id1='+q+'',                                                         
         dataType: 'json',
         async:false,                    
         success: function(data)          
            
            id = data[0];              
            vname = data[1];
         
      ).done(function()
           printWithAjax(); 
      );



 //end of the for statement
//end of ajax call function

【讨论】:

完成与success 相同。你想要".always()" @MichelAyres 我认为只有成功才会成功,并且无论如何都会运行...... run no matter what == .always() 看看jQuery.ajax handling continue responses: “success:” vs “.done”? 还有"An alternative construct to the success callback option, the .done() method replaces the deprecated jqXHR.success()"【参考方案4】:

.done() 附加到您的 ajax 请求中。

$.ajax(
  url: "test.html",
  context: document.body
).done(function()  //use this
  alert("DONE!");
);

查看JQuery Doc.done()

【讨论】:

【参考方案5】:

你应该在 head 中设置 async = false。 使用 post/get 代替 ajax。

jQuery.ajaxSetup( 异步:假 );

    $.post(
        url: 'api.php',
        data: 'id1=' + q + '',
        dataType: 'json',
        success: function (data) 

            id = data[0];
            vname = data[1];

        
    );

【讨论】:

【参考方案6】:

试试

var id;
var vname;
function ajaxCall()
for(var q = 1; q<=10; q++)
 $.ajax(  

 url: 'api.php',                        
 data: 'id1='+q+'',                                                         
 dataType: 'json',
 success: function(data)          
  

    id = data[0];              
   vname = data[1];
   printWithAjax();

      );



//end of the for statement
  //end of ajax call function

【讨论】:

以上是关于Ajax调用完成后执行函数的主要内容,如果未能解决你的问题,请参考以下文章

仅在 javascript 循环完成后执行 ajax 调用

ajax怎样再次执行?

JS如何等ajax执行完毕后再继续执行后续函数

在某些代码完成执行后延迟 $ajax 调用

回调函数的使用场合

使用ajax在codeigniter控制器中调用函数不起作用