从asynchronous请求循环获取值

我试图编写一个nodejs程序,查询github的回购列表(通过github API的节点封装: https ://www.npmjs.com/package/github),并检索数组中的git克隆url,然后我希望按字母顺序sorting。

由于调用的asynchronous性质,我不知道如何等待,直到所有的asynchronous请求返回?

这里是问题的循环。 repoArray是[username / reponame]格式的数据库

 var urls = []; for (var i=0; i < repoArray.length; i++) { var components = repoArray[i].split('/'); github.repos.get({ user: components[0], repo: components[1] }, function(err, res) { urls.push(res.ssh_url); }); } // do a case-insensitive sort urls.sort(function(a,b) { return a.localeCompare(b, 'en', {'sensitivity': 'base'}); }); console.log("urls: " + urls); 

基本上,因为在循环中的github.repos.get()调用都是基于asynchronous/基于callback的,所以当代码到达urls.sort(),然后是console.log()时,没有一个或一些github.repos.get ()调用还没有完成。

我不是那么熟悉承诺或延期,但是,这是一条路吗? 我不知道如何重构该循环,以便urls.sort()仅在循环的所有请求完成后才被调用?

Async库正好适用于这些场景,而且通常是人们倾向于用于这些问题的东西。 它可以帮助您并行执行asynchronous任务,并在完成时使用async.each执行callback。

 var async = require('async'); var urls = []; //make each HTTP request function process(repo,callback){ var components = repo.split('/'); github.repos.get({ user: components[0], repo: components[1] }, function(err, res) { if(err){ // call callback(err) if there is an error return callback(err); } else{ urls.push(res.ssh_url); // call callback(null) if it was a success, return callback(null); } }); } // this will iterate over repoArray and pass each repo to the 'process' function. // if any of the calls to 'process' result in an error, // the final callback will be immediately called with an error object async.each(repoArray,process,function(error){ if(error){ console.error('uh-oh: '+error) return; } else{ // do a case-insensitive sort urls.sort(function(a,b) { return a.localeCompare(b, 'en', {'sensitivity': 'base'}); }); console.log("urls: " + urls); } }); 

编辑:因为你最后sorting他们的url将是有序的。