Ожидание возврата ожидаемых данных при использовании в forEach, но обещание в карте - PullRequest
0 голосов
/ 17 апреля 2019

У меня проблемы с пониманием разницы между двумя подходами.

У меня есть определенный Promise.All, который работает как положено, после этого функция then используется для извлечения данных из ответов. Я не могу понять, почему, если я использую подход forEach, я распечатываю данные, но если я использую подход карты, я получаю обещания возврата.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script>
        Promise.all(
            ["koop4", "gVenturi", "aledocdonnini" ].map(  user => fetch( 'https://api.github.com/users/'+user+'/repos', { method: 'GET'})  )
        ).then( res => {
            // this works properly
            const data = [];
            res.forEach( async r  => { 
              data.push(await r.json()); 
            });
            return data;
            // this return promises
            /* return res.map( async r  => await r.json() n)*/
        }).then(console.log)
    </script>
</head>
<body>
    
</body>
</html>

1 Ответ

2 голосов
/ 17 апреля 2019

Используйте map вместо forEach

Promise.all([
    "koop4",
    "gVenturi",
    "aledocdonnini"
].map(user => fetch("https://api.github.com/users/" + user + "/repos", {method: "GET"})))
    .then(res => Promise.all(res.map(r => r.json())))
    .then(console.log);

или используйте .json() в первом map Ведьма чище на мой взгляд

Promise.all([
    "koop4",
    "gVenturi",
    "aledocdonnini"
].map(user => fetch("https://api.github.com/users/" + user + "/repos", {method: "GET"}).then(r => r.json())))
    .then(console.log);
...