使用具有递归函数的承诺

Use promises with recursive function

我想弄清楚是否可以在递归函数中使用 promises 而不是标准回调。

我现在的样子:

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 推送到数组。如果 val.a return 结果数组,否则调用 recursive 并使用 val 和累积结果数组作为参数。参见

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

鉴于您使用 val 作为结果参数调用回调,只需

return val;

来自 then 回调。就是这样。

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