2

これが私が見逃している単純なものであることを願っていますが、私が望むようにデータを返すことができないようです. 関数ログインはユーザー名を受け取り、認証用のパスワードと ID をデータベースからのユーザーの XY 座標と共に返します。

XY 座標は、ログイン クエリから返される ID に依存します。ID はすべてPromise、認証のためにメイン関数に返されます。ただし、すべてのデータを 1 つのうまく編まれたオブジェクトに戻すことはできません。

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 に答える