将两个成功函数附加到AJAX调用中(用于排队)

时间:2018-08-13 22:57:41

标签: jquery ajax

我有一个队列脚本,用于对通过AJAX调用发送到API的命令进行排队。这些调用不能异步调用,必须按它们发生的顺序执行。

现在,我只是为AJAX调用准备数据,然后将这些数据推送到数组中。然后,我开始进行实际的AJAX调用。完成后,我想执行原始的成功功能,但我也想启动队列中的下一个项目...我拥有的代码:

var queue = [];
function add( call ){
  queue.push( call );

  if( queue.length == 1 )
     launch();
}

function launch(){
   if( !queue.length ) return;

   $.ajax( call );
}

要发起AJAX调用(在表单的Submit函数内部):

var data = new Formdata( $("#theform")[0] );
add( {
   data: data,
   success: function( fb ){
       console.log( fb );
   }
});

我现在遇到的问题是AJAX调用将调用我推送到数组上的成功函数,但是我想附加第二个函数,以便在有另一个调用的情况下对“启动”进行另一个调用在第一个呼叫完成之前将其推入队列。我确实需要按照执行顺序进行调用。因此,仅在先前的AJAX调用完成后才应删除队列中的第一项。我有不同的形式来启动AJAX调用,因此每个调用的成功功能都不同。所以:在第二个调用中,我想执行:

queue.shift();  // to remove the call that just finished
launch();       // to start executing the next call

一旦AJAX调用成功,如何再次调用launch()函数,或者我需要将代码(移位和启动)添加到我推入队列的每个成功函数中?那行得通,但是对我来说看起来很混乱。

1 个答案:

答案 0 :(得分:1)

应该能够执行以下操作:

function launch(){
   if( !queue.length ) return;

   var call = queue[0];
   $.ajax( call ).done( function(){
       queue.shift();
       launch();
   });
}

请注意,您还需要考虑错误处理