Вернуть зависимое обещание

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


person Sterling Archer    schedule 31.03.2014    source источник


Ответы (2)


Вы можете сделать:

    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() вокруг них.

person Adam    schedule 31.03.2014
comment
Не могли бы вы дать объяснение? Ваш ответ в настоящее время неполный. - person bjb568; 31.03.2014

person    schedule
comment
всегда приятно слышать от вас - однако просто db.select это пользовательская функция, поэтому она уже асинхронна :) - person Sterling Archer; 31.03.2014
comment
Странно, я не могу отметить тебя в комментариях. Я попробую, большое спасибо! - person Sterling Archer; 31.03.2014
comment
@RUJordan Это не позволит вам пометить людей, которые уже будут уведомлены (т. е. автор ответа всегда уведомляется о комментариях к этому ответу). - person Aaron Dufour; 31.03.2014
comment
@AaronDufour охххххх, я этого не знал. - person Sterling Archer; 31.03.2014
comment
Теперь осталось дождаться .spread поддержки ES6 в браузерах - person Benjamin Gruenbaum; 31.03.2014