gpt4 book ai didi

javascript - 从异步请求循环中获取值

转载 作者:太空宇宙 更新时间:2023-11-04 00:52:29 25 4
gpt4 key购买 nike

我正在尝试编写一个nodejs程序,该程序在github上查询存储库列表(通过github API的 Node 包装器:https://www.npmjs.com/package/github)并检索数组中的git克隆url,然后我希望按字母顺序排序。

由于调用的异步性质,我不确定如何等待所有异步请求返回?

这是有问题的循环。 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() 调用都是异步/基于回调的,因此当代码到达 urls.sort() 然后到达 console.log() 时,没有或部分 github.repos.get() 调用尚未完成。

我对 promise 或延期不太熟悉,但这是要走的路吗?我不确定如何重构该循环,以便仅在循环中的所有请求完成后才调用 urls.sort() ?

最佳答案

Async库正是针对这些场景而设计的,并且通常是人们倾向于使用它来解决这些问题。它可以帮助您并行执行异步任务,并在它们全部完成时执行回调,使用 async.each .

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);
}
});

编辑:由于您在最后对它们进行排序,因此网址将按顺序排列。

关于javascript - 从异步请求循环中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31756578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com