使用延迟到多个ajax调用的链循环

时间:2014-04-02 18:17:27

标签: javascript jquery ajax jquery-deferred

有很多问题已经对此有了答案,但到目前为止所有这些都没有用到这种设置。

function login(u,p) {
   console.log(1);
   return $.post(url, {u,p});
}

function out() {
   console.log(3);
   //a function that does not return deferred
   // clear cookies
}

function doSomething() {
  console.log(2);
  // a function that returns a deferred
  return $.post(...);
}
var data = [{u: 'au', p: 'ap'}, {u: 'bu', p: 'bp'}]

$.each(data, function(k,v){
  login(v.u, v.p).then(doSomething).then(out);
});

我期待它的顺序如下:

1
2
3
1
2
3

但是我得到了

1
2
1
3
2
3

为什么会这样,即使我在等待使用then来解决的承诺

2 个答案:

答案 0 :(得分:2)

如果您希望登录同步运行:

var p = new jQuery.Deferred();
$.each(data, function(k,v){
  p.then(function() {
    return login(v.u, v.p);
  }).then(doSomething).then(out);
});

$.each中迭代的每个新项目都不会触发新的响应,直到p完成最后一个。

答案 1 :(得分:1)

这个想法是创建一个像@Popnoodles所提到的递归函数。

e.g。

function a() {
  return $.post();
}

function b() {
  return $.post();
}

function c() {
   console.log('no promise.');
}

// and the recursive main function

function main() {
   if(counter < data.length){
      $.when(a().then(b).then(c)).done(function(){
        counter++;
        main();
      });
   }
}

main();

Here is how it works,打开控制台,看看它是如何按顺序记录功能的。