Промис в циклах

Да, я не совсем понимаю асинхронность, поэтому прошу вас помочь. С 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 ? Ожидают исполнения, отклонения Промиса и только потом выдают результат

Спасибо


Ответы (0 шт):