2016-11-11 8 views
1

再帰関数で標準コールバックの代わりに約束を使用できるかどうかを調べようとしています。私は今それを持って再帰関数で約束を使用する

方法は:

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

     }); 

    } 

LOLの無...配列へ

+0

何か問題が生じ、 '.a'が決して設定されないとどうなりますか? – Walf

+1

_ "return // <<< ???"、LOL no does not does ... "_はい、そのパターンは期待した結果を返すはずです。 'recursive'への最初の呼び出しの後、' recursive'からの戻り値は '。prom()'であり、 '.then()'は新しい 'Promise'オブジェクトを返します。 – guest271314

答えて

4

。それでおしまい。

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

そのアプローチは、最後の 'val'を' recthenive'に連鎖した '.then()'に戻すだけです – guest271314

+0

@ guest271314 OPが探しているのはまさに何ですか? – Bergi

+0

できます。 'return val'の唯一の理由は' val'オブジェクトが関数呼び出しの範囲外で定義されていない場合です。通話ごとに累積された結果を返す方法としての通訳質問。蓄積された結果は、現在オブジェクト「val」に発生している可能性があります。もしそれが大文字で、 'val'が呼び出しの中のオブジェクトを参照しているなら、' yes'は 'val'オブジェクトを返します。オブジェクトが最初に呼び出しの範囲外で定義され、 'recursive'に渡されてプロセスを開始する場合、' val'を返す必要はありません。 OPは質問で 'return'パターンを使用し、次に' .then() 'でオブジェクトを参照します。 – guest271314

2

プッシュvalval.aが結果の配列を返す場合は、valrecursiveを呼び出し、累算結果の配列をパラメータとして呼び出します。 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)}); 
     } 
    }); 
    } 
+0

は間違いなく感謝します、ありがとう! –

+0

どこから配列を取得しましたか?非約束コードはどちらも使用しませんでした。 – Bergi

+0

その '.catch(function(e){console.log(e)})' *関数内には置かないでください。エラーをキャッチするのは呼び出し元の義務です。 – Bergi

2

最近、ES8の非同期/待機によって、より読みやすくなりました。私は今try-catchをスキップしました。あなただけ

return val; 

thenコールバックから、result引数としてvalでコールバックを呼び出した、指定された

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