使用延迟到多个ajax调用的链循环
有很多问题已经对此有了答案,但到目前为止所有这些都没有用到这种设置。
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(vu, vp).then(doSomething).then(out); });
我期待它的顺序如下:
1 2 3 1 2 3
但我明白了
1 2 1 3 2 3
为什么会这样,即使我在等待使用then
解决方案
如果您希望登录同步运行:
var p = new jQuery.Deferred(); $.each(data, function(k,v){ p.then(function() { return login(vu, vp); }).then(doSomething).then(out); });
在$.each
迭代的每个新项目都不会触发新的响应,直到p
完成最后一个。
这个想法是创建一个像@Popnoodles所提到的递归函数。
例如
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();
以下是它的工作原理 ,打开控制台,看看它是如何按顺序记录function的。