2

我希望这是我所缺少的一件简单的事情,但我似乎无法按我的意愿返回数据。我的函数 login 需要一个用户名,并返回用于身份验证的密码和 id,以及来自数据库的用户 XY 坐标。

XY 坐标取决于登录查询返回的 ID,这些 ID 都作为 a 返回Promise给 main 函数进行身份验证。但是,我看不到将所有数据返回到一个精心编织的对象中。

function login(user) {
    var query = 'SELECT password,id FROM player WHERE name='+mysql.escape(user);
    return db.select(query).then(function(rows) {
        console.log(rows);
        return Promise.all([
            getX(rows[0].id),
            getY(rows[0].id)
        ]);
    });
}

这记录:

[ { password: 'nopasswordforu', //<-- not a real password
    id: 9 } ]
[ [ { x: 32 } ], [ { y: 36 } ] ]

密码是从控制台语句记录的,而不是返回的。唯一返回的是xy坐标。如何以与函数返回的 Promise 相同的方式返回查询结果?

4

2 回答 2

4
function login(user) {
    var query = 'SELECT password,id FROM player WHERE name='+mysql.escape(user);
    return db.select(query).then(function(rows) {
        // Promise.all is unnecessary if the caller calls .spread()
        return [getX(rows[0].id), getY(rows[0].id), rows[0]];
    });
}

login(...).spread(function(x, y, user){
    console.log(x, y, user.password, user.id);
})
于 2014-03-31T18:27:51.103 回答
0

你可以这样做:

    return Promise.all([
        getX(rows[0].id),
        getY(rows[0].id)
    ]).then(function(xCoord,yCoord) {
      return Promise.all([{
          password:rows[0].password,
          x:xCoord[0].x,
          y:yCoord[0].y
      }]);
    });

后一段代码看起来像这样:

login('username').then(function(data) {
/* 
 exposed:

 data.password,
 data.x,
 data.y

*/
});

请注意,我在这里假设 getX 和 getY 是异步函数,这就是您Promise.all()围绕它们调用的原因。

于 2014-03-31T18:24:36.180 回答