json 我想从名称数组中获取用户,但这会引发错误

5uzkadbs  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(113)

创建一个异步函数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不是函数

llew8vvj

llew8vvj1#

你的代码有很多地方有点小错误,但我认为主要的问题是你把allSettled的结果推到了“更正”中,但是你想推.value
您实际上也不需要对corrects执行任何操作,只返回失败的请求。
但是这里有一个版本可以把它清理干净,我假设你想忽略失败的请求,但是不确定,因为从你的代码中很难判断:

async function getUsers(names) {

  const requests = names.map(name => fetch(`https://api.github.com/users/${name}`));//gets users
  const results = await Promise.allSettled(requests);

  const successResponses = results
    .filter(result => {
      // Filter out rejected promises and error responses.
      // I think this is what you want but not sure?
      if (result.status!=='fulfilled' || !result.value.ok) return false;
    });

  return Promise.all(successResponses.map(response => response.json()));

}
omjgkv6w

omjgkv6w2#

Promise.allSettled是一个非常特殊的函数,在大多数情况下您并不需要它。还有其他像explicit promise constructor anti-pattern这样的痛点。相反,将问题分解为更小、更简单的部分-

  1. getUser(name)采用单个名称并返回用户对象或空值
  2. getUsers(names)获取名称列表并将getUserMap到每个名称
async function getUser(name) {
  try {
    const res = await fetch(`https://api.github.com/users/${name}`)
    return res.ok ? res.json() : null
  }
  catch (err) {
    return null
  }
}

function getUsers(names) {
  return Promise.all(names.map(getUser))
}

getUsers(["ivg", "glennsl", "jeffsco", "nosuchuser111"]).then(console.log, console.error)
.as-console-wrapper { min-height: 100%; top: 0; }
[
  {
    "login": "ivg",
    "id": 2336698,
    "node_id": "MDQ6VXNlcjIzMzY2OTg=",
    ...
  },
  {
    "login": "glennsl",
    "id": 5207036,
    "node_id": "MDQ6VXNlcjUyMDcwMzY=",
    ...
  },
  {
    "login": "jeffsco",
    "id": 4043178,
    "node_id": "MDQ6VXNlcjQwNDMxNzg=",
    ...
  },
  null      // user not found
]

相关问题