使用递归函数的承诺

Use promises with recursive function

本文关键字:承诺 递归函数      更新时间:2023-09-26

我想弄清楚是否有可能在递归函数中使用承诺而不是标准回调。

我现在的样子:

function recursive(data, cb){
     (function promiseProvider(data){
          return newThenable(data).then(function(val){
                 if(val.a){
                    cb(null, val);
                 }
                 else {
                    return promiseProvider(val);
                 }
          });
     })(data);
}

这可以工作,但是我不知道如何才能使一个纯承诺实现。

也许这将工作?

  function recursive(data){
      return newThenable(data).then(function(val){
               if(val.a){
                  return // <<< ???
                 }
                 else {
                   return recursive(val);
                 }
        });
     }

如果您正在调用回调与val作为结果参数,只是

return val;

then回调。就是这样。

function recursive(data){
     return newThenable(data).then(function(val){
         if (val.a){
             return val;
         } else {
             return recursive(val);
         }
     });
 }

Push val到array。如果val.a返回结果数组,则调用recursive,并将val和累积结果数组作为参数。参见multiple, sequential fetch() Promise

  function recursive(data, results) {
    return newThenable(data).then(function(val) {
      if (val.a) {
        // results.push(val);
        return results
      } else {
        results.push(val);
        return recursive(val, results).catch(function(e) {console.log(e)});
      }
    });
  }

现在ES8的async/await使它更具可读性。我现在跳过了try-catch。

async function recursive(data, results = []) {
    let val = await newThenable(data);
    if (val.a) {
        return results
    } else {
        results.push(val);
        return recursive(val, results);
    }
}