중첩 된 약속 레이아웃에서 내 머리를 감싸는 데 어려움을 겪고 있습니다. 다음과 같이 내 현재 코드는 다음과 같습니다중첩 된 약속으로 빌드 된 하나의 객체 반환
라우터 당신이 볼 수 있듯이, 라우터 이벤트에 대한 정보를 얻을 수있는 호출을 시작
getInfo(id) {
db.main('events').where('id', id).select()
.then((result) => {
if(result.length > 0) {
var event = result[0];
//regular functions
event.status = this.getStatus(id);
event.content = this.getContent(id);
event.price = this.getPrice(id);
//promise functions
var users = this.getUsers(id);
var hosts = this.getHosts(id);
Promise.all([users, hosts]).then(values => {
event.users = values[0];
event.hosts = values[1];
//return whole event object to router
return event;
})
.catch((err) => {
return {
result: 'error',
error: err
};
});
} else {
return {
result: 'error',
error: "Event does not exist"
};
}
}).catch((e) => {
return {
result: 'error',
error: "Could not retrieve event info"
};
});
}
router.get(`/${config.version}/event/:id?`, function (req, res, next) {
var event = new Event(req, res, next);
event.getInfo(req.params.id).then((info) => {
res.send(info);
});
});
기능. 이 함수는 데이터베이스 호출을 수행하고 이벤트 데이터를 가져옵니다. 그 후에 다른 테이블에서 이벤트의 사용자와 호스트를 가져와 해당 정보를 이벤트 객체에 추가 한 다음 전체 객체를 라우터로 보내 클라이언트로 보냅니다.
getInfo 함수에서 약속을 반환하지 않기 때문에 오류가 발생하지만 반환 할 약속이나 방법이 확실하지 않습니다.
감사합니다. 감사합니다
나는 지난 밤에이 문제에 부딪쳤으며 모범 사례가 무엇인지 궁금합니다 (이미 답변이있는 경우). – ssube
@ssube 가장 쉬운 방법은 약속을 사용하여 코드를 래핑 한 다음 모든 데이터가 수집되면 resolve()를 호출하는 것입니다. 제 경우에는 Ahmed의 답변에서 볼 수 있듯이 Promise.all (...) 내에서 wrapper 약속에 대한 resolve()를 호출했습니다. –