async / await,数据获取和未解决的promise

时间:2018-02-08 19:25:19

标签: javascript node.js asynchronous

我在我正在研究的nodejs应用程序中遇到了一个问题,似乎无法找到解决方案。

我正在使用GitHub API:

  1. 从给定用户获取存储库
  2. 获取每个检索到的存储库的问题
  3. 将数据整合到一个“repo”对象中
  4. 步骤3是出现问题的地方。 我正在使用两个异步函数getReposForUser()getIssuesForRepo(),其行为如下

    async function getReposForUser(username) {
        // Fetch user repos from GitHub
        var result = await github.repos.getForUser({
            username: username,
            per_page: 100
        })
        // Grab issues for each repo
        repos = repos.map(repo => {
            return getIssuesForRepo(repo);
        });
        // console.log(repos);
     }
    
    
    async function getIssuesForRepo(repo) {
    /* 
        if there are issues available, fetch them and attach
        them to the repo object (under a property named issues).
        otherwise, assign the issues property a value of null
    */
    if (repo.has_issues) {
        let issues = await github.issues.getForRepo({
            owner: repo.owner.login,
            repo: repo.name,
            state: 'open'
        });
        repo.issues = issues;
        return repo;
    } else {
         return repo.issues = null;
        }
    }
    

    当我在console.log(repos)运行后尝试getIssuesForRepo()时,我得到一组Promises。经过一些研究后,很明显async / await函数返回Promises。好的,得到了​​。我的问题是,我可以做些什么来创建具有这些承诺的已解决值的新对象数组?基本上,我想将为每个repo检索到的问题数组附加到其各自的repo 。

    提前感谢任何可能提供帮助的人。

    此外,为什么在getReposForUser()运行后getIssuesForRepo()内部会有效?

    let firsRepo = await getIssuesForRepo(repos[0]);
    console.log(firsRepo);
    

    在这种情况下,我实际上看到了对象,而不是未解决的承诺......

1 个答案:

答案 0 :(得分:4)

  

我可以做些什么来创建具有这些承诺的已解决值的新对象数组?

承诺数组上的

await Promise.all

repos = await Promise.all(repos.map(repo => {
    return getIssuesForRepo(repo);
}));

附注:您的map回调可以 getIssuesForRepo

repos = await Promise.all(repos.map(getIssuesForRepo));

map使用条目,索引和映射的数组调用其回调。由于您的getIssuesforRepo仅使用其第一个参数,因此将忽略额外的两个参数。