Проще сделать с async/await
(.then/.catch
требует немного больше работы - также, ссылка на функцию Promise.each в Bluebird).Для ясности лучше переместить это из componentDidMount
в свой собственный метод класса.
В качестве примечания: если это действие происходит для каждого продукта, то этот вторичный запрос должен обрабатываться на бэкэнде.,Таким образом, вам нужно всего лишь один AJAX
запрос и получить все, что вам нужно, в ответе one .
componentDidMount = () => this.fetchData();
fetchData = async () => {
try {
const productRes = fetch(`myapi.com/availability?productid=12345`) // get product data
const productData = await productRes.json(); // convert productRes to JSON
const storeIDs = productData.map(({store_id}) => (store_id)); // map over productData JSON for "store_ids" and store them into storeIDs
const storeData = [];
await Promise.each(storeIDs, async id => { // loop over "store_ids" inside storeIDs
try {
const storeRes = await fetch(`myapi.com/store?id=${id}`); // fetch data by "id"
const storeJSON = await storeRes.json(); // convert storeRes to JSON
storeData.push(storeJSON); // push storeJSON into the storeData array, then loop back to the top until all ids have been fetched
} catch(err) { console.error(err) }
});
this.setState({ productData, storeData }) // set both results to state
} catch (err) {
console.error(err);
}
}