创建一个异步函数getUsers(names),它获取一个GitHub登录名数组,从GitHub获取用户并返回一个GitHub用户数组。
包含给定用户名的用户信息的GitHub url是:https://api.github.com/users/USERNAME.
在沙盒里有一个测试示例。
重要详情:
1.每个用户应该有一个获取请求。2.请求不应该彼此等待。这样数据就可以尽快到达。3.如果任何请求失败,或者如果没有这样的用户,函数应该在结果数组中返回null。
输入:数组;输出:数组;
类型错误:r.json不是函数
async function getUsers(names) {
let requests = names.map(name => fetch(`https://api.github.com/users/${name}`));//gets users
let users = [];//Final answer
await Promise.allSettled(requests)
.then(responses => new Promise(function(resolve) {// returrn correct users promise
let corrects = [];
responses.forEach((result) => {
if (result.value.ok) { //check statuse 200-299
corrects.push(result);
} else {
users.push(result); // else add to Finell answer null
}
})
resolve(corrects); //return users with 200-299 statuse
}))
.then(corrects => Promise.all(corrects.map(r => r.json()))) //processing
.then(results => results.forEach(result => users.push(result))); //add to finel answer correct requests
return users;
}
//输入:数组; //输出:数组;
//类型错误:r.json不是函数
2条答案
按热度按时间llew8vvj1#
你的代码有很多地方有点小错误,但我认为主要的问题是你把
allSettled
的结果推到了“更正”中,但是你想推.value
。您实际上也不需要对
corrects
执行任何操作,只返回失败的请求。但是这里有一个版本可以把它清理干净,我假设你想忽略失败的请求,但是不确定,因为从你的代码中很难判断:
omjgkv6w2#
Promise.allSettled
是一个非常特殊的函数,在大多数情况下您并不需要它。还有其他像explicit promise constructor anti-pattern这样的痛点。相反,将问题分解为更小、更简单的部分-getUser(name)
采用单个名称并返回用户对象或空值getUsers(names)
获取名称列表并将getUser
Map到每个名称