我有一个队列脚本,用于对通过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()函数,或者我需要将代码(移位和启动)添加到我推入队列的每个成功函数中?那行得通,但是对我来说看起来很混乱。
答案 0 :(得分:1)
应该能够执行以下操作:
function launch(){
if( !queue.length ) return;
var call = queue[0];
$.ajax( call ).done( function(){
queue.shift();
launch();
});
}
请注意,您还需要考虑错误处理