Javascript 如何递归调用promise函数
我正在尝试使用javascript承诺递归调用异步函数,但还没有找到一种有效的模式 这就是我想象中的效果:Javascript 如何递归调用promise函数,javascript,recursion,promise,Javascript,Recursion,Promise,我正在尝试使用javascript承诺递归调用异步函数,但还没有找到一种有效的模式 这就是我想象中的效果: var doAsyncThing = function(lastId){ new Promise(function(resolve, reject){ // async request with lastId return resolve(response) } } var recursivelyDoAsyncThing = function(lastId){
var doAsyncThing = function(lastId){
new Promise(function(resolve, reject){
// async request with lastId
return resolve(response)
}
}
var recursivelyDoAsyncThing = function(lastId){
doAsyncThing(lastId).then(function(response){
return new Promise(function(resolve, reject){
//do something with response
if(response.hasMore){
//get newlastId
return resolve(recursivelyDoAsyncThing(newLastId));
}else{
resolve();
}
});
});
}
recursivelyDoAsyncThing().then( function(){
console.log('done');
});
为什么这样不行?我误解了什么
是否有更好的模式来解决此问题?
递归DoAsyncThing
需要返回承诺才能继续链。在您的情况下,您只需让doAsyncThing
返回其承诺:
var doAsyncThing = function(lastId){
// Notice the return here:
return new Promise(function(resolve, reject){
然后将return
添加到您的doasynchthing
调用中,如下所示:
var recursivelyDoAsyncThing = function(lastId){
// Notice the return here:
return doAsyncThing(lastId).then(function(response){
在
递归DoAsyncThing
函数中缺少一个返回。此外,你应:
我有一个递归承诺的简单例子。该示例基于数字的计算factorial
let code=(函数(){
让getFactorial=n=>{
返回新承诺((解决、拒绝)=>{
如果(n){
返回事实*n;
})
)
});
}
返回{
阶乘:函数(数){
getFactorial(数字)。然后(
response=>console.log(响应)
)
}
}
})();
阶乘(5);
阶乘(6);
阶乘(7)代码>完美的例子,因为大多数开发人员都是从阶乘开始递归的。很好的例子。谢谢
function recursivelyDoAsyncThing(lastId) {
return doAsyncThing(lastId).then(function(response) {
//^^^^^^
//do something with response
if (response.hasMore) {
//get newlastId
return recursivelyDoAsyncThing(newLastId);
} else {
return; // undefined? Always return a useful value
}
});
}