我正在尝试链接承诺,而不是管道,而只是链接。
例如,我有这种方法:
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
时才这样做。