如何递归调用Promise函数

5

我试图使用JavaScript promises递归调用异步函数,但是还没有找到可行的模式。

以下是我认为会起作用的代码:

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

为什么这个不起作用?我误解了什么?

有更好的模式来解决这个问题吗?

3个回答

3

recursivelyDoAsyncThing需要返回Promise才能继续链式操作。在你的情况下,你只需要让doAsyncThing返回它的Promise:

var doAsyncThing = function(lastId){
  // Notice the return here:
  return new Promise(function(resolve, reject){

然后在您的 doAsyncThing 调用中添加return,如下所示:
var recursivelyDoAsyncThing = function(lastId){
  // Notice the return here:
  return doAsyncThing(lastId).then(function(response){

2

我有一个递归promise的简单例子。这个例子是基于计算数字的阶乘

let code = (function(){
 let getFactorial = n =>{
  return new Promise((resolve,reject)=>{
   if(n<=1){
    resolve(1);
   }
   resolve(
    getFactorial(n-1).then(fact => {
     return fact * n;
    })
   )
  });
 }
 return {
  factorial: function(number){
   getFactorial(number).then(
    response => console.log(response)
   )
  }
 }
})();
code.factorial(5);
code.factorial(6);
code.factorial(7);


完美的例子,因为大多数开发人员都是从阶乘开始递归。 - user10150997
好的例子。谢谢。 - user10134933

2
您在recursivelyDoAsyncThing函数中缺少一个return。此外,您应该避免使用Promise构造反模式
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
    }
  });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接