使用具有递归函数的promises

时间:2016-11-11 09:30:09

标签: javascript node.js recursion promise es6-promise

我试图弄清楚是否可以在递归函数中使用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);
                 }

        });

     }

但是,这不起作用。

3 个答案:

答案 0 :(得分:4)

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

return val;
来自then回调的

。就是这样。

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

答案 1 :(得分:3)

val推送到数组。如果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)});
      }
    });
  }

答案 2 :(得分:2)

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