2014-03-31 3 views
2

나는 이것이 실종 된 간단한 것이기를 바라고 있습니다. 그러나 나는 원하는대로 데이터를 반환 할 수 없습니다. 내 함수 로그인은 사용자 이름을 사용하고 데이터베이스의 XY 좌표와 함께 인증을위한 비밀번호와 ID를 반환합니다.의존적 약속 반환

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에서 쿼리 결과를 반환하려면 어떻게해야합니까?

답변

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); 
}) 
+0

언제나 여러분의 의견을 듣기 좋습니다. - 그러나 db.select는 단지 커스텀 기능이기 때문에 이미 비동기입니다. –

+0

@RUJordan ok : P heh – Esailija

+0

이상하게도, 코멘트에 태그를 붙이지 않을 것입니다. 나는이 한 발을 줄거야, 많이 바쁘다 고 고마워! –

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 
     }]); 
    }); 

코드 후자의 조각 같은 것을 보일 것이다 : 나는 getX와 getY()는 비동기 기능이 여기에 있다는 가정을하고

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

data.password, 
data.x, 
data.y 

*/ 
}); 

주, 어떤 그들 주위에 Promise.all()라고 부르는 이유입니다.

+2

설명 할 수 있겠습니까? 귀하의 답변은 현재 불완전합니다. – bjb568

+0

코드가 많은 것을 복잡하게 만듭니다. –