我正在尝试使用两个异步函数调用两个API。问题是第二个
异步函数的api调用取决于第一个异步函数的结果。
id
的每个对象作为url参数。并将为每个对象返回状态users
的那些用户。我知道如何执行此操作的逻辑,但无法在现实世界中实现。 嵌套的异步函数在我看来总是很难,这是我的尝试:
204
第一个函数运行良好,我单独对其进行了测试。它返回所需的数组。
但是,当我尝试将第一个异步功能与第二个异步功能结合在一起时,问题就开始了。
一个。
答案 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)
您当前的代码存在一些问题。
您在非承诺值(.then
)上调用allUsers.then
。不需要这样做是因为您已经做过const users = await getUsers()
,这会将users
设置为已解析的值,而不是承诺。
使用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");
};