обещание.все с forEach - PullRequest
       32

обещание.все с forEach

0 голосов
/ 30 октября 2018

Я отредактировал вопрос. Изменена синтаксическая ошибка, и она все еще не работает. Я использую github api для получения списка пользователей, а затем для каждого пользователя - для получения своих репозиториев. Моя идея состояла в том, чтобы получить все репозитории (которые я получил) и, когда все это будет сделано, поместить массив allRepos в пользовательский объект, а затем вернуть пользовательский объект, чтобы я мог его визуализировать. Я сделал это с помощью цикла foreach внутри Promise.all. Я знаю, что я не использую это правильно, потому что я не могу использовать .then () после Promise.all. Можно ли использовать Promise.all так, как мне нужно, или мне нужно заранее определить массив, который я в него помещаю? Помощь будет оценена.

function onGetUsers() {
    // var prmUsers=getUsers()
    getUsers()
    .then(getrepos)
    .then(data=> console.log(data))//here i want to render the object

}
function getrepos(users){
    var usersObj={
        users: users,
    }
    var allRepos = []
        Promise.all(users.forEach(user => {
            var currUser = axios.get(user.repos_url)
                .then(data => allRepos.push(data)); 
            return currUser;
        })).then('here i want to put allRepos in the usersObj')
    return usersObj
    
}
function getUsers() {
    var prmRes = axios.get('https://api.github.com/users');
    var prmUsers = prmRes.then(res => {
        return res.data;
    });
    return prmUsers;
}
<!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">
    <link rel="stylesheet" href="css/index.css">
    <title>Github Users</title>
</head>
<body>
    <button onclick="onGetUsers()">Get Users</button>
    <script src="lib/axios.js"></script>
    <script src="js/index.js"></script>
</body>
</html>

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Нажмите кнопку и дождитесь завершения запроса

function onGetUsers() {
// var prmUsers=getUsers()
getUsers()
    .then(getrepos)
    .then(data=> {
  console.log(JSON.stringify(data));
})

}
function getrepos(users){
const userPromises = users.map(user => {
  return axios.get(user.repos_url).then(userRepos => user.repos = userRepos);
});
return Promise.all(userPromises)
} 
function getUsers() {
  
var prmRes = axios.get('https://api.github.com/users');
var prmUsers = prmRes.then(res => {
  
    return res.data;
});
return prmUsers;
}
<!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">
    <link rel="stylesheet" href="css/index.css">
     <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.18.0/axios.min.js"></script>
    <script src="js/index.js"></script>
    <title>Github Users</title>
</head>
<body>
    <button onclick="onGetUsers()">Get Users</button>
   
</body>
</html>
0 голосов
/ 30 октября 2018
function getrepos(users){
   let p = Promise.resolve(true);
    users.map(user => {
      p = p.then(() => axios.get(user.repos_url).then(userRepos => user.repos = userRepos));
    });
    return p.then(() => users);

}

С помощью этого метода вы получите объект пользователей, где каждый пользователь будет иметь свойство репо, состоящее из их репо. Вам просто нужно заменить один метод на этот. В конечном итоге вы можете просмотреть их и объединить все репозитории в одном массиве.

...