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

Jquery 将两个成功函数附加到AJAX调用(用于排队),jquery,ajax,Jquery,Ajax,我有一个队列脚本,它将通过AJAX调用发送到API的命令排队。这些调用不能异步调用,它们必须按发生顺序执行 现在我只是为AJAX调用准备数据,然后将数据推送到数组中。然后我开始进行实际的AJAX调用。一旦完成,我想执行最初的成功函数,但我也想启动队列中的下一项。。。我的守则如下: var queue = []; function add( call ){ queue.push( call ); if( queue.length == 1 ) launch(); } func

我有一个队列脚本,它将通过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调用,请在表单的提交函数中执行以下操作:

var data = new Formdata( $("#theform")[0] );
add( {
   data: data,
   success: function( fb ){
       console.log( fb );
   }
});
我现在遇到的问题是,AJAX调用将调用我推送到数组上的success函数,但我想附加第二个函数,该函数对“launch”进行另一次调用,以防在第一次调用完成之前有另一个调用推送到队列上。我确实需要按执行顺序进行调用。因此,队列中的第一项只应在前面的AJAX调用完成后删除。我有不同的表单启动AJAX调用,因此每个调用的成功函数都不同。所以:在第二次通话中,我想执行:

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

AJAX调用成功后,我如何再次调用启动函数,或者我是否需要将代码移位和启动添加到我推送到队列上的每个成功函数中?这可能会奏效,但在我看来相当混乱。

应该能够执行以下操作:

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

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

注意,你还需要考虑错误处理< /P>你在哪里调用ADD?这是一个循环吗?或者只是根据应用程序中的事件/触发器在随机时间被调用?似乎您应该在回调中调用add。虽然简单地将queue.shift和launch添加到回调中并没有实际问题。@charlietfl add在提交表单或执行其他操作时被调用。基本上,用户在网站上所做的每一个动作都必须按照用户所做动作的顺序记录到数据库中。示例中的第二个代码块包含该代码,在site@ObsidianAge:有多个表单需要AJAX调用。从数据抽象的角度来看,将shift和launch添加到这些函数中似乎有点过时了。。。然后每个表单的成功表单中都有队列内容,我想将其整齐地保存在AJAX队列代码中……这难道不会在调用AJAX时立即启动“完成”命令,而不是在调用“成功”函数后启动吗?实际上,最好使用than而不是success and done。但是没有…请求完成后触发done是的,这将在AJAX调用返回后启动!它在调用中调用原始的“success”函数。这正是我需要的。错误处理确实是一个很好的观点。如果在这种情况下的某个时刻出现错误,那么不要让后续操作启动是很重要的。感谢大家的提醒,我从来没有使用过它,但是还有一个“始终”方法,不管状态如何都应该运行。如果它是一个失败的请求,它将获得与error相同的参数。实际上,也应该在“done”或then中调用queue.shift,否则,如果启动了第一个AJAX调用并添加了第二个调用,就会启动新的启动。第二次调用必须在第一次调用完成后启动。。我将编辑您的答案以解决此问题