2017-10-13 11 views
0

私はこれに最善のアプローチを理解するのに困っています。フェッチ呼び出しのネストによるネストされたデータへのアクセス方法

私の目標は、ネストされたデータを表示することです。 JSONを含むページに私を取るhttps://horizons-json-cors.s3.amazonaws.com/products.json

を -

私はこのURLにフェッチを使用します。 jsonの内部には3つのURLがあります。各URLには私がアクセスする必要のあるデータが含まれています。

これまでは、最初のレイヤーにアクセスしましたが、アイテムURLの配列があります。私はoutter fetch呼び出しの中にある間にデータをフェッチする方法を理解していないと思います。ここで

は(。結果は各URLは私が必要とするデータが含まれているURLの配列、である)これまでの私のコードです:

componentDidMount() { 
    console.log('Fetch'); 
    fetch("https://horizons-json-cors.s3.amazonaws.com/products.json") 
    .then((resp) => (resp.json())) 
    .then((json) => { 
     var productUrlArr = []; 
     for (var i = 0; i < json.length; i++) { 
     productUrlArr.push(json[i].url); 
     } 
    .catch((err) => { 
     console.log('error', err); 
    }); 
    }   

あなたたちは私を助け、本当にアクセスする方法を歩くことができれば次のレベルのデータは、本当に感謝しています。

+0

をこの方法でデータを取得することができますが、以下のAPI呼び出しの応答を置くことはできますか? –

+0

これはあなたが所有するAPIですか?もしそうなら、APIを変更して、別のjsonファイルへのリンクではなく、製品のデータを実際に返すようにしてください。それ以外の場合は、最初のJSONファイルを取得してから、各要素を反復処理してから_additional_呼び出しを行う必要があるため、非常に非効率です。 – dmon

+0

私が所有するAPIではありません。ネストされたデータを扱う方法を私に教えるはずの学校からの練習です。私はそれが非効率であることを認識しますが、私はまだそれをどのように扱うかを学ばなければなりません。私の問題は、外部フェッチの呼び出し中に各項目/ URLを繰り返し処理して呼び出す方法を考え出すことです – aglaze

答えて

0

コードに少し間違いがあります。

あなたが、アレイ内のデータを使用することができ、それにより.catch

})が欠落しています。

componentDidMount(){ 
    console.log('Fetch'); 
    fetch("https://horizons-json-cors.s3.amazonaws.com/products.json") 
    .then((resp) => (resp.json())) 
    .then((json) => { 
     var productUrlArr = []; 
     for (var i = 0; i < json.length; i++) { 
     productUrlArr.push(json[i].url); 
     } 
     console.log(productUrlArr); 
    }).catch((err) => { 
     console.log('error', err); 
    }); 
} 

希望します。

0

簡単です。最初にあなたのようにすべてのURLを取得します。次にマップしてPromise.allに渡します。

fetch("https://horizons-json-cors.s3.amazonaws.com/products.json") 
    .then((resp) => (resp.json())) 
    .then((json) => { 
    Promise.all(json.map(product => 
     fetch(product.url).then(resp => resp.text()) 
    )).then(texts => { 
     // catch all the data 
    }) 
    }).catch((err) => { 
    console.log('error', err); 
    }); 
2

あなたは、あまりにも内部URLの

// 1. Outer Fetch call initiated here 
fetch("https://horizons-json-cors.s3.amazonaws.com/products.json") 
.then(res => { 
    return res.json() 
}) 
.then(res => { 

    // 2. array for storing url's retrieved from response 
    var urlArray = [] 

    if (res.length > 0) { 

     // 3. Push url inside urlArray 
     res.map(data => urlArray.push(data.url)) 
    } 

    // 4. an array of urls 
    return urlArray 
}) 
.then(urls => { 

    // Return an promise which will return "JSON response" array for all URLs. 
    // Promise.all means “Wait for these things” not “Do these things”. 

    return Promise.all(urls.map(url => { 
     // Take url fetch response, return JSON response 
     return fetch(url).then(res => res.json()) 
    } 
    )) 
}) 
.then(res => { 
    // Store all objects into array for later use 
    var objArr = res; return objArr 
    }) 
//.then(...) 
関連する問題