Reputation: 33
I have a nested promise that fetches data and then presents it to the DOM.
I am trying to convert it into an async/await syntax, but because it is nested with a Promise.All I am having trouble converting it.
fetch(searchUrl)
.then(function (response) {
return response.json()
})
.then(function (data) {
searchLoader.style.display = "none";
for (let i = 0; i < 10; i++) {
let stock = `${data[i].name}, (${data[i].symbol})`;
listOfStocks.innerHTML += `<li class="list-group-item"><a href="./company.html?symbol=${data[i].symbol}">${stock}<a/></li>`;
// console.log(data[i].symbol)
}
return Promise.all(data.map(item => fetch(`${BaseUrl}company/profile/${item.symbol}`)));
})
.then(function (response) {
return Promise.all(response.map(x => x.json()));
})
.then(function (data1) {
console.log(data1);
for (let i = 0; i < listOfStocks.children.length; i++) {
if (data1[i].profile.changes >= 0) {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc" style="color:green;"> ${data1[i].profile.changesPercentage}</span>`;
} else {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc"> ${data1[i].profile.changesPercentage}</span>`;
}
}
Thanks
Upvotes: 0
Views: 365
Reputation: 1003
Should be something like this:
try {
const response = await fetch(searchURL)
const data = await response.json()
searchLoader.style.display = "none";
for (let i = 0; i < 10; i++) {
let stock = `${data[i].name}, (${data[i].symbol})`;
listOfStocks.innerHTML += `<li class="list-group-item"><a href="./company.html?symbol=${data[i].symbol}">${stock}<a/></li>`;
// console.log(data[i].symbol)
}
const data1 = await Promise.all(data.map(async (item) => {
const response = await fetch(`${BaseUrl}company/profile/${item.symbol}`)
return response.json()
}));
for (let i = 0; i < listOfStocks.children.length; i++) {
if (data1[i].profile.changes >= 0) {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc" style="color:green;"> ${data1[i].profile.changesPercentage}</span>`;
} else {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc"> ${data1[i].profile.changesPercentage}</span>`;
}
}
} catch (e) {
console.log(e)
}
Upvotes: 0
Reputation: 33
it seems to be working @bergi - thanks for the pointer
const response = await fetch(searchUrl);
const data = await response.json();
searchLoader.style.display = "none";
for (let i = 0; i < 10; i++) {
let stock = `${data[i].name}, (${data[i].symbol})`;
listOfStocks.innerHTML += `<li class="list-group-item"><a href="./company.html?symbol=${data[i].symbol}">${stock}<a/></li>`;
// console.log(data[i].symbol)
}
const response1 = await Promise.all(data.map(item => fetch(`${BaseUrl}company/profile/${item.symbol}`)));
const data1 = await Promise.all(response1.map(x => x.json()));
for (let i = 0; i < listOfStocks.children.length; i++) {
if (data1[i].profile.changes >= 0) {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc" style="color:green;"> ${data1[i].profile.changesPercentage}</span>`;
} else {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc"> ${data1[i].profile.changesPercentage}</span>`;
}
}
```
Upvotes: 1
Reputation: 8316
This is how you would convert a Promise.then(...).then(...).then(....)
chain to an async/await
code :-
async function processStuff(){
const data = await fetch(searchUrl).then((response)=>response.json());
searchLoader.style.display = "none";
for (let i = 0; i < 10; i++) {
let stock = `${data[i].name}, (${data[i].symbol})`;
listOfStocks.innerHTML += `<li class="list-group-item"><a href="./company.html?symbol=${data[i].symbol}">${stock}<a/></li>`;
// console.log(data[i].symbol)
}
const response = await Promise.all(data.map(item => fetch(`${BaseUrl}company/profile/${item.symbol}`)));
const data1 = await Promise.all(response.map(x => x.json()));
for (let i = 0; i < listOfStocks.children.length; i++) {
if (data1[i].profile.changes >= 0) {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc" style="color:green;"> ${data1[i].profile.changesPercentage}</span>`;
} else {
listOfStocks.children[i].innerHTML = `<img class="logo-for-list" src="${data1[i].profile.image}" /> ${listOfStocks.children[i].innerHTML} <span class="color-prc"> ${data1[i].profile.changesPercentage}</span>`;
}
}
}
processStuff();
Note - There is nothing special I did here for Promise.all()
since it simply returns a Promise
. Had it been just Promise.resolve(2)
, the approach would be the same.
Upvotes: 0