【问题标题】:Run ajax calls in order按顺序运行ajax调用
【发布时间】:2017-02-10 04:17:28
【问题描述】:

我有一个动态确定的 ajax 调用列表,需要一个接一个地进行。由于承诺在所有浏览器中的实现并不相同,有没有办法在前一个完成后进行每个 ajax 调用?

我试过了:

var favoritesArray = [1,2,3] //dynamically created by user
var arrayOfCalls = $.each(favoritesArray, function each(idx) {
  var favId = favoritesArray[idx];
  return $.ajax({ url: '/favorites/' + favId, type: 'DELETE' });
});
$.when(arrayOfCalls)
.then(function success() {
  doStuff();
});

所有调用都会运行,但不要等待前一个调用完成。有没有办法做到这一点?

【问题讨论】:

  • 不知道你为什么担心它。这些似乎都不依赖于以前的。 $.when 将是一致的跨浏览器,但请注意,$.each 不会返回任何内容,因此 arrayOfCalls 将是未定义的
  • 每个调用都会更新同一个列表,如果调用同时触发,列表中剩余的项目将不正确且不同,具体取决于哪个先完成。
  • 感谢您提供有关 $.each 的说明。
  • arrayOfCalls.reduce((p, c) => p.then(c), $.when()).then(function success() { ...
  • @BenjaminGruenbaum 看起来应该这样做,但没有。

标签: jquery ajax promise


【解决方案1】:

您可以使用递归。 (我用 setTimeout 代替了 AJAX 请求)

function syncExecute(index,length){
 var favId = favoritesArray[index];
 setTimeout(function(){
if(index<length){
      syncExecute(index+1,length);
            console.log(index);
      }else{
      console.log("All Call Executed");
      }
},5000);

}

syncExecute(0,favoritesArray.length);

演示:https://jsfiddle.net/b18vo9ds/

您可以将setTimeout替换为AJAX请求,并在AJAX请求成功时递归调用该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多