我希望这是一个我想念的简单事情,但我似乎无法按照我的意愿返回数据。我的函数login使用用户名,并返回用于身份验证的密码和id,以及数据库中的用户XY坐标。
XY坐标取决于从登录查询返回的ID,它们都作为Promise
返回到主函数进行身份验证。但是,我无法看到将所有数据都返回到一个很好的编织对象中。
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中返回查询结果?
答案 0 :(得分: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);
})
答案 1 :(得分: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()
。