Промис в циклах
Да, я не совсем понимаю асинхронность, поэтому прошу вас помочь. С async/await все проще, но с синтаксисом Промисов возникают проблемы 1.) Подскажите, почему forEach не ожидаем исполнения Промиса, в отличии от while, for of циклов ?
let links = ['https://jsonplaceholder.typicode.com/todos/1', 'https://jsonplaceholder.typicode.com/todos/2', 'https://jsonplaceholder.typicode.com/todos/3'];
async function check(urls) {
let res1 = [];
let res2 = [];
let i=0;
console.log('before while');
while(i<urls.length) {
let r1 = await fetch(urls[i])
let r2 = await r1.json()
res1.push(r2.title);
i+=1; }
console.log('after while ', res1);
//Doesn't work with forEach method
// urls.forEach(async url=>{
// let r3 = await fetch(url);
// let r4 = await r3.json();
// res2.push(r4.title)
// console.log('forEach ', r4.title); })
for (const url of urls) {
let r3 = await fetch(url);
let r4 = await r3.json();
res2.push(r4.title)
console.log('for of ', r4.title); }
console.log('after for ', res2);
return [res1, res2] }
console.log(await check(links))
2.) Как пройтись по массиву links при помощи синтаксиса Промисов. Так не работает, сначала возвращает пустой массив, наверно данные в него не успевают записаться, а потом выполняется цикл for of
function checkPr3(urls) {
let res = []
return new Promise((resolve, reject) => {
for (const url of urls) {
fetch(url)
.then(r1=>r1.json())
.then(r2=>{
res.push(r2.title)
})
}
resolve(res);
})
}
checkPr3(links).then(el=>console.log(el))
3.) Если добавить условие для исполнения Промиса - вызов resolve, то работает как нужно, но выглядит криво и наверно должно быть решение вызывать resolve только после того как завершится цикл for of
function checkPr(urls) {
let res = []
return new Promise((resolve, j)=>{
urls.forEach((link, index)=>{
fetch(link)
.then(res=>res.json())
.then(res2=>{
console.log(index)
res.push(res2.title)
if (Object.values(res).length==urls.length) {
resolve(res) }
})
})
})
}
checkPr(links).then(result=>console.log(result))
4.) Так же вопрос, в синтаксисе Промисов, then, catch методы это подобие await ? Ожидают исполнения, отклонения Промиса и только потом выдают результат
Спасибо