有很多问题已经对此有了答案,但到目前为止所有这些都没有用到这种设置。
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
来解决的承诺
答案 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,打开控制台,看看它是如何按顺序记录功能的。