Вернуть зависимое обещание
Я надеюсь, что это простая вещь, которую мне не хватает, но я не могу вернуть данные так, как мне бы хотелось. Моя функция входа в систему принимает имя пользователя и возвращает пароль и идентификатор для аутентификации вместе с координатами XY пользователя из базы данных.
Координаты XY зависят от идентификатора, возвращенного из запроса на вход в систему, которые все возвращаются как 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
координаты. Как я могу вернуть результаты запроса в том же обещании, которое возвращает функция?
2 ответа
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);
})
Вы могли бы сделать:
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()
вокруг них.