2017-08-22 33 views
4

私はAPIからデータを取得しようとしていますが、呼び出しごとに1000個のアイテムしか返さないため、すべてのデータを取得するまで再帰的に行います。非同期API呼び出しを再帰的に呼び出します。

私はこのようなものを使用したい、すべてのコールの後、私は

コールが同期した場合をチェックする必要がありますので、合計であり、事前にどのように多くの項目がわからない:

function fetch(all, start) { 
    const newData = getData(start, 1000); 
    all = all.concat(newData); 
    return (newData.length === 1000) ? fetch(all, all.length) : all; 
} 

ただし、getData()の呼び出しは非同期です。 Promise.all()を使用すると、あまり必要なコールがあらかじめわからないため、一連のコールを準備できないため、機能しません。

私は発電機でasync/awaitでこれを解決できると感じていますが、どうすればよいか分かりません。誰かが私を正しい方向に向けることができますか?

それが違いを作る場合、私は角4

答えて

4

これは、物事はあなたのケースで行われている方法によって異なります。

async function fetch(all, start) { 
    const newData = await getData(start, 1000); 
    all = all.concat(newData); 
    return (newData.length === 1000) ? await fetch(all, all.length) : all; 
} 
+0

驚くべきことに、それはそれほど簡単でした。ありがとう! –

+0

ようこそ。はい、そういうわけで、async/awaitは素晴らしいです。 – estus

3

を使用しているあなたは、再帰なしasync/awaitでこれを実装することができます。

let fetch = async() { 
    try { 
    let start = 0; 
    let all = []; 
    let newData; 
    do { 
     newData = await getData(start, 1000); 
     start += newData.length; 
     all = all.concat(newData); 
    } while (newData.length > 0); 

    return all; 
    } catch (err) { 
    console.log(err); 
    } 
} 
+0

あなたのソリューションは、@ estus年代と同じようにうまく動作しますが、彼は少しだけクリーナーです:getDataは約束を返すことを考えると、それがあります。あなたの答えをありがとう、私はこれがとても簡単かもしれないことを認識していない。 –

+1

再帰関数に注意してください。また、非同期関数 'getData'でスローされたエラーをどのように扱うかが問題になります。 – alexmac

+0

ありがとう、私はそれを念頭に置いておきます。私はコードをより機能的に(より少ない状態変数)保持するので、再帰に向かって傾斜していますが、エラーを処理するという難題を導入することに同意します。 –

関連する問題