如何通过另一个异步函数内部的异步函数遍历数组?

时间:2019-10-23 12:52:06

标签: javascript async-await

我正在尝试使用两个异步函数调用两个API。问题是第二个
 异步函数的api调用取决于第一个异步函数的结果。

  1. 我的第一个异步函数从api获取一些数据并返回一个
    对象数组。
  2. 第二个异步函数调用另一个api,该api从{br1 id的每个对象作为url参数。并将为每个对象返回状态
    对象,我们只过滤状态为users的那些用户。

我知道如何执行此操作的逻辑,但无法在现实世界中实现。 嵌套的异步函数在我看来总是很难,这是我的尝试:

204

第一个函数运行良好,我单独对其进行了测试。它返回所需的数组。
但是,当我尝试将第一个异步功能与第二个异步功能结合在一起时,问题就开始了。 一个。

2 个答案:

答案 0 :(得分:1)

使用async / await并不需要迷失Promises,因为代码只是逐行运行:

const getUsers = async () => {
  const { users } = await axios.get(url);
  return users;
};

const getCheckedUsers = async () => {
  const allUsers = await getUsers();
  const results = [];
  for (user of allUsers) {
    const { status } = await axios.get(`another_url_that_takes_${user.id}`);
    if (status === "204") {
      results.push(user);
    }
  }
  return results;
}

答案 1 :(得分:1)

您当前的代码存在一些问题。

  1. 您在非承诺值(.then)上调用allUsers.then。不需要这样做是因为您已经做过const users = await getUsers(),这会将users设置为已解析的值,而不是承诺。

  2. 使用map并仅在user等于status时返回"204",对于具有状态的用户,您将隐式返回undefined"204"外。如果要完全忽略这些值,则可以在filter数组上使用users

const getUsers = async () => {
    const { users } = await axios.get(url);
    return users;
};

const getStatus = async (userId) => {
    const { status } = await axios.get(`another_url_that_takes_${userId}`);
    return status;
};

const getCheckedUsers = async () => {
    const users = await getUsers();
    const statuses = await Promise.all(users.map(user => getStatus(user.id)));
    return users.filter((_, index) => statuses[index] === "204");
};