检查是否for循环与mysql调用完成nodejs

时间:2017-11-05 03:35:43

标签: javascript mysql node.js asynchronous promise

所以我有另一个传递res的函数的数组,这是一个如下所示的列表:

[ RowDataPacket { UserID: 26 }, RowDataPacker { UserID: 4 } ]

它存储用户ID,我想要的是一个找到用户id的用户名的函数,并将它们存储在另一个数组中。这就是我所拥有的:

function getThem(res, params) {
        var promises = res.map(function (item) { // return array of promises
            // return the promise:
                    for (i = 0; i < Object.keys(res).length; i++) {
                        console.log("user: ", res[i].UserId);
                        getUsernameFromId(res[users.length].UserId).then(function() {
                            console.log("username: ", res[0].username);
                            users.push(res[0].username); 
                        });
                    }
                }, function (err) {
                    console.error(err);
                });
        Promise.all(promises).then(function () {
            console.log("users: ", users);
            //do something with the finalized list of albums here
        });
    }
控制台输出

用户:26
用户:4
用户:26
用户:4
用户:[]
用户名:undefined
用户名:undefined
用户名:undefined
用户名:undefined

那我怎么能等待for循环完成mysql调用呢?也许有另一种方法可以做到这一点?

编辑:不介意未定义的用户名,以后很容易修复。告诉我如何在数组中包含那些未定义的

1 个答案:

答案 0 :(得分:2)

假设(必须假设,因为您的代码似乎使用res就像一个具有您需要的所有内容的majick对象,而对它做任何事情)实际的res看起来像

[ { UserID: 26 }, { UserID: 4 } ]

getUsernameFromId返回一个具有username属性的对象,例如

{ username: 'blah', ...otherproperties }

getThem可以简单地

function getThem(res, params) {
    return Promise.all(res.map(({UserID}) => getUsernameFromId(UserId).then(({username}) => username)))
    .then(users => {
        console.log("users: ", users);
        //do something with the finalized list of albums here
    });
}

或在#34;旧学校&#34;的JavaScript

function getThem(res, params) {
    return Promise.all(res.map(function (_ref) {
        var UserID = _ref.UserID;
        return getUsernameFromId(UserId).then(function (_ref2) {
            var username = _ref2.username;
            return username;
        });
    })).then(function (users) {
        console.log("users: ", users);
        //do something with the finalized list of albums here
    });
}