想多个异步定时任务,一个接一个触发,不是同时触发
var task1 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t1');
$d.resolve();
},1000);
return $d.promise();
}
//2
var task2 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t2');
$d.resolve();
},1200);
return $d.promise();
}
//3
var task3 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t3');
$d.resolve();
},1200);
return $d.promise();
}
//4
var task4 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t4');
$d.resolve();
},1200);
return $d.promise();
}
$.when(task1(),task2(),task3(),task4()).done(function(){
console.log('done');
});
代码没有按预期的结果:t1,等待1秒后出现t2,后面的跟前面一样
但现实是同时触发出现了,不知道是不是哪里写错了...求指导,谢谢!
在线代码例子:可以运行看看效果
如果是用then好像也不行,结果会更奇怪
var task1 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t1');
$d.resolve();
},1000);
return $d.promise();
}
//2
var task2 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t2');
$d.resolve();
},1200);
return $d.promise();
}
//3
var task3 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t3');
$d.resolve();
},1200);
return $d.promise();
}
//4
var task4 = function(){
var $d = $.Deferred();
setTimeout(function(){
console.log('t4');
$d.resolve();
},1200);
return $d.promise();
}
task1().then(task2()).then(task3()).then(task4()).then(function(){
console.log('ok');
})
输出结果居然是
t1
ok
t2
t3
t4
改回这样就可以了
task1().then(function(){
return task2()
}).then(function(){
return task3()
}).then(function(){
return task4()
}).then(function(){
console.log('ok');
})
另外用那些比较好的异步库,如:when.js 那个?
同时触发是正常的,因为你就是那样写的,看这里:
$.when(task1(),task2(),task3(),task4())
虽然用了when,但你确实是同时执行了task1(),task2(),task3(),task4()这四个函数,所以四个异步操作真心是同时触发的,没毛病!
如果你希望顺序执行上面4个异步任务,用下面这种方式:
var tasks = [
function() {
var $d = $.Deferred();
setTimeout(function() {
console.log('t1');
$d.resolve();
}, 1000);
return $d.promise();
},
function() {
var $d = $.Deferred();
setTimeout(function() {
console.log('t2');
$d.resolve();
}, 1200);
return $d.promise();
},
function() {
var $d = $.Deferred();
setTimeout(function() {
console.log('t3');
$d.resolve();
}, 1200);
return $d.promise();
},
function() {
var $d = $.Deferred();
setTimeout(function() {
console.log('t4');
$d.resolve();
}, 1200);
return $d.promise();
}
];
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。