我正在尝试链接承诺,而不是管道,而只是链接。

例如,我有这种方法:

var execute = function(x){
   // this could be an AJAX call
   var d= $.Deferred();

    console.log('Begin ' + x);

    setTimeout(function(){
       console.log('End ' + x);
       d.resolve();
    },500);

    return d;
};


我想多次执行此方法,但一次又一次。我创建了一个比使用eval更有效的方法,但是我对使用eval不太满意:

var executeTimes = function(r){
    var s = '';
    for(var i=0;i<r;i++){
        s = s + 'execute('+i+')';
        if(i!==r-1)
        s = s + '.then(function(){';
    }

    for(var i=0;i<r-1;i++){
        s= s+'})';
    }

    eval(s);
}


这个想法是,执行executeTimes(3);会得到以下输出:

Begin 0
End 0
Begin 1
End 1
Begin 2
End 2


我在这里创建了一个实时示例:http://jsfiddle.net/vtortola/Cfe5s/

最好的解决方案是什么?

干杯。

最佳答案

递归看起来很整洁:http://jsfiddle.net/Cfe5s/3/

var executeTimes = function(r) {
  (function recurse(i) {
    execute(i).then(function() {
      if(i + 1 < r) {
        recurse(i + 1);
      }
    });
  })(0);
};


您可以使用execute启动一个运行0的函数,完成该操作后,您将再次(通过递归)重新开始,但是这次使用1。递归之前,您必须检查是否要继续:仅当增量值仍小于r时才这样做。

09-07 01:36