使用jquery延迟而不是回调

时间:2015-08-19 09:59:50

标签: javascript jquery

我正在尝试解决一个任务数组(数组是动态的),这些任务是异步的,我需要在下一个问题之前确保上一个任务成功。到目前为止,这就是我所拥有的:

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

感谢您的帮助!

2 个答案:

答案 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
});