我已按照帖子Correct way to write loops for promise.成功创建了承诺循环。
然而,似乎这种方法不适用于嵌套循环
我要模拟的循环:
var c = 0;
while(c < 6) {
console.log(c);
var d = 100;
while(d > 95) {
console.log(d);
d--;
}
c++;
}
承诺(注意我在这里简化了promFunc()的逻辑,所以不要认为它没用):
var Promise = require('bluebird');
var promiseWhile = Promise.method(function(condition, action) {
if (!condition()) return;
return action().then(promiseWhile.bind(null, condition, action));
});
var promFunc = function() {
return new Promise(function(resolve, reject) {
resolve();
});
};
var c = 0;
promiseWhile(function() {
return c < 6;
}, function() {
return promFunc()
.then(function() {
console.log(c);
// nested
var d = 100;
promiseWhile(function() {
return d > 95;
}, function() {
return promFunc()
.then(function() {
console.log(d);
d--;
});
})// .then(function(){c++}); I put increment here as well but no dice...
c++;
});
}).then(function() {
console.log('done');
});
实际结果:
0
100
1
99
100
2
98
99
100
3
97
98
99
100
4
96
97
98
99
100
5
96
97
98
99
100
96
97
98
99
96
97
98
96
97
done
96
任何解决方案?
答案 0 :(得分:1)
promWhile
返回外部循环需要等待的承诺。您确实忘了return
它,这使then()
结果在外promFunc()
之后立即解析。
… function loopbody() {
return promFunc()
.then(function() {
console.log(c);
c++; // move to top (or in the `then` as below)
…
return promiseWhile(
// ^^^^^^
… ) // .then(function(){c++});
});
} …
答案 1 :(得分:0)
您希望使用Promise.resolve()
而不是promFunc()
它会做同样的事情。