我在JavaScript中有以下功能:
// fetches the username based on the user ID
const fetchUsername = async (userId) => {
const response = await axios({ ... });
return {
userId,
username: response.data.username
}
};
// fetches the online status based on the user ID
const fetchOnline = async (userId) => {
const response = await axios({ ... });
return {
userId,
online: response.data.online
}
};
const fetchUsers = (userIds) => {
const promises = [];
userIds.forEach(userID => {
return new Promise(async (resolve, reject) => {
const usernameObject = await fetchUsername(userId);
const onlineObject = await fetchOnline(userId);
resolve({ ...usernameObject, ...onlineObject });
})
})
Promise.all([promises]).then(response => console.log(response));
};
关于这段代码,我有两个问题:
>
promise.all()。then()中的响应是另一个承诺。 它不是一个包含用户名和联机状态的对象的数组,而是承诺(如:{“_40”:0,“_55”:null,“_65”:0,“_72”:null}
)。
在new Promise中使用Async/Await是反模式的,但是我不知道如何将2个promises的结果组合成1个对象。
编辑:
我只能接受一个答案,但是Gabriel Donadel Dall'Agnol的答案帮助我解决了第一个问题,Klaycon的答案帮助我解决了第二个问题。
非常感谢大家!
您刚刚错过了填充承诺
数组
const fetchUsers = (userIds) => {
const promises = userIds.map(userID => {
return new Promise(async (resolve, reject) => {
const usernameObject = await fetchUsername(userId);
const onlineObject = await fetchOnline(userId);
resolve({ ...usernameObject, ...onlineObject });
})
})
Promise.all(promises).then(response => console.log(response));
};
除了关于填充promisions
数组而不将其包装在另一个数组[promisions]
:
在new Promise中使用Async/Await是反模式的,但是我不知道如何将2个promises的结果组合成1个对象。
这是array#map
的一个方便的用例,带有异步回调。 如果将回调标记为异步,它将自动返回一个承诺,该承诺将用返回值进行解析。 所以你可以这样写:
const promises = userIds.map(async userID => {
const usernameObject = await fetchUsername(userId);
const onlineObject = await fetchOnline(userId);
return { ...usernameObject, ...onlineObject };
});
Promise.all(promises).then(response => console.log(response));