【发布时间】:2013-06-17 13:14:21
【问题描述】:
用 Promise 做类似 while 循环的惯用方式是什么。所以:
做某事 如果条件仍然存在,请再做一次 重复 然后做点别的。
dosomething.then(possilblydomoresomethings).then(finish)
我已经这样做了,我想知道是否有更好/更惯用的方法?
var q = require('q');
var index = 1;
var useless = function(){
var currentIndex = index;
console.log(currentIndex)
var deferred = q.defer();
setTimeout(function(){
if(currentIndex > 10)
deferred.resolve(false);
else deferred.resolve(true);
},500);
return deferred.promise;
}
var control = function(cont){
var deferred = q.defer();
if(cont){
index = index + 1;
useless().then(control).then(function(){
deferred.resolve();
});
}
else deferred.resolve();
return deferred.promise;
}
var chain = useless().then(control).then(function(){console.log('done')});
输出: 1 2 3 4 5 6 7 8 9 10 11 完成
【问题讨论】:
-
“我想知道是否有更好/更惯用的方法?”不,递归是要走的路。
-
没有递归你会怎么做?我觉得递归可能并不酷,但我无法弄清楚如何做到这一点。有什么见解吗?
-
如果没有像 Taskjs 这样的“停在这里”机制,我认为你不能使用迭代。
-
如果您的环境中有 async/await 可用,则可以避免递归;请参阅下面的更新答案。