JavaScript忽略将对象添加到数组

问题描述

function setUsersDeFinitions(data,userID){
    let users = new Array();
    return new Promise((resolve)=>{
        data.forEach(el => {
            if (el.id_adder === userID) {
                getUserName(el.id_added).then(u => {
                    users.push({
                        username: u,locked: el.locked !== null,canUnlock: el.locked === userID,id: el.id_added
                    })
                }).catch(e=>{
                    console.log(e);
                })
            } else {
                getUserName(el.id_adder).then(u=>{
                    users.push({
                        username: u,id: el.id_adder
                    })
                }).catch(e=>{
                    console.log(e);
                })
            }
        })
        resolve(users);
    })
}

问题是,当我尝试执行所生成项目的console.log时,它可以工作,但是当它调用Array.push方法时,它将忽略该命令。 我究竟做错了什么? 预先感谢。

解决方法

所有这些操作都应使用async / await来完成,而不是将所有内容都包装在Promise中-这将极大地简化您的代码:

async function setUsersDefinitions(data,userID){
    let users = new Array();
    for(var i=0;i<data.length;i++){
        var el = data[i];
        var id = (el.id_adder === userID) ? el.id_added : el.id_adder;
        var u = await getUserName(id);
        users.push({
                     username: u,locked: el.locked !== null,canUnlock: el.locked === userID,id: id
                  });
    }
    return users;
}

(注意:为简洁起见,省略了错误处理)

然后,无论您在何处调用此函数,都应await(自身必须在async函数中):

async function doWork(){
    var users = await setUsersDefinitions(some_data,some_userID);
    console.log(users);
}