提问者:小点点

允诺。all返回另一个允诺


我在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的答案帮助我解决了第二个问题。

    非常感谢大家!


  • 共2个答案

    匿名用户

    您刚刚错过了填充承诺数组

    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));