我正在尝试解决一个任务数组(数组是动态的),这些任务是异步的,我需要在下一个问题之前确保上一个任务成功。到目前为止,这就是我所拥有的:
var tasks = ['cleaning', 'washing', 'shopping'];
var index = 0;
while(index < tasks.length) {
// success => next task
// fail => exit
index++;
}
function doTask(name) {
var d = $.Deferred();
console.log('doing ' + name);
setTimeout(function() {
d.resolve(name + ' is done');
}, 1000);
return d.promise();
}
// my old method
function doTask(name, callback) {
console.log('doing ' + name);
setTimeout(function() {
callback(name + ' is done');
}, 1000);
}
所以输出将是
// doing cleaning
// cleaning is done
// doing washing
// washing is done
// doing shopping
// shopping is done
感谢您的帮助!
答案 0 :(得分:0)
var tasks = ['cleaning', 'washing', 'shopping'];
var index = 0;
function asyncTasks(tasks_length){
$.when(doTask(tasks[index])).then(function(res){
console.dir(res);
index++;
if(index<tasks_length){
asyncTasks(tasks_length);
} else {return;}
}, function(){return;})
}
function doTask(name) {
var d = $.Deferred();
console.log('doing ' + name);
setTimeout(function() {
d.resolve(name + ' is done');
}, 1000);
return d.promise;
}
asyncTasks(tasks.length);
像这样的Smth,在语法上不确定,可以使用角度承诺
答案 1 :(得分:0)
在 doTask()函数中,使用multiTooltipTemplate
替换代码以获取promise对象,以下代码仅在以前的所有承诺中执行。
d.promise()
输出:
var tasks = ['cleaning', 'washing', 'shopping'];
function doTask(name) {
var d = $.Deferred();
console.log('doing ' + name);
setTimeout(function() {
d.resolve(name + ' is done');
}, 1000);
return d.promise();
}
var d1 =doTask(tasks[0]);
var d2 =doTask(tasks[1]);
var d3 =doTask(tasks[2]);
$.when( d1, d2,d3 ).done(function (w1,w2,w3) {
console.log(w1,w2,w3);
// Success call back
});