2017-11-10 46 views
0

具体来说,给定一个数据列表,我希望遍历该列表并为之前的所有数据元素执行一次提取操作。正如所写的那样,代码立即在整个列表中迭代,同时启动所有操作。然后,即使提取操作仍在运行,那么在数据可能已经被处理之前,我仍然会运行该调用。如何在Promises循环之后运行回调?

我读了一些关于将所有Promises放在一个数组中,然后将该数组传递给Promise.all()调用,随后是一个能够按预期方式访问所有已处理数据的函数,但我不是确定在这种情况下究竟该怎么做,因为我在这个for循环中嵌套了Promises

 for(var i in repoData) { 
      var repoName = repoData[i].name; 
      var repoUrl = repoData[i].url; 
      (function(name, url) { 
       Promise.all([fetch(`https://api.github.com/repos/${username}/${repoData[i].name}/commits`), 
        fetch(`https://api.github.com/repos/${username}/${repoData[i].name}/pulls`)]) 
       .then(function(results) { 
        Promise.all([results[0].json(), results[1].json()]) 
        .then(function(json) { 
         //console.log(json[0]); 
         var commits = json[0]; 
         var pulls = json[1]; 
         var repo = {}; 
         repo.name = name; 
         repo.url = url; 
         repo.commitCount = commits.length; 
         repo.pullRequestCount = pulls.length; 
         console.log(repo); 
         user.repositories.push(repo); 
        }); 
       }); 
      })(repoName, repoUrl); 
     } 
    }).then(function() { 
     var payload = new Object(); 
     payload.user = user; 
     //console.log(payload); 
     //console.log(repoData[0]); 
     res.send(payload); 
    }); 
+0

这是不是你应该使用的承诺。 .. –

+0

问题代码是否完整?什么是最后的'.then()'链接? – guest271314

回答

4

一般来说,当你需要为阵列中的全部项目的运转异步操作,答案是使用Promise.all(arr.map(...))这种情况下,似乎也不例外。

还记得,你需要在你的then回调return值,以便就值传递给下一个then(或到Promise.all聚集一切)。

当面临复杂的情况时,它有助于将其分解成更小的块。在这种情况下,您可以将代码隔离为查询单个回购数据到自己的函数中。一旦你这样做,代码来查询数据他们的所有归结为:

Promise.all(repoData.map(function (repoItem) { 
    return getDataForRepo(username, repoItem); 
})) 

请尝试以下方法:

// function to query details for a single repo 
function getDataForRepo(username, repoInfo) { 
    return Promise 
    .all([ 
     fetch(`https://api.github.com/repos/${username}/${repoInfo.name}/commits`), 
     fetch(`https://api.github.com/repos/${username}/${repoInfo.name}/pulls`) 
    ]) 
    .then(function (results) { 
     return Promise.all([results[0].json(), results[1].json()]) 
    }) 
    .then(function (json) { 
     var commits = json[0]; 
     var pulls = json[1]; 

     var repo = { 
     name: repoInfo.name, 
     url: repoInfo.url, 
     commitCount: commits.length, 
     pullRequestCount: pulls.length 
     }; 

     console.log(repo); 
     return repo; 
    }); 
} 

Promise.all(repoData.map(function (repoItem) { 
    return getDataForRepo(username, repoItem); 
})).then(function (retrievedRepoData) { 
    console.log(retrievedRepoData); 

    var payload = new Object(); 
    payload.user = user; 
    //console.log(payload); 
    //console.log(repoData[0]); 
    res.send(payload); 
}); 
相关问题