Javascript 如何递归调用promise函数

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){

我正在尝试使用javascript承诺递归调用异步函数,但还没有找到一种有效的模式

这就是我想象中的效果:

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
    }
  });
}