私は、ネストされた約束レイアウトの周りを囲むのに苦労しています。次のように私の現在のコードは次のとおりです。ネストされた約束で構築された1つのオブジェクトを返す
ルータ
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(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"
};
});
}
あなたが見ることができるように、ルータは、イベントに関する情報を取得するための呼び出しを開始します。この関数はデータベース呼び出しを行い、イベントデータを取得します。その後、別のテーブルからイベントのユーザーとホストを取得し、その情報をイベントオブジェクトに追加してから、オブジェクト全体をルータに戻してクライアントに送信する必要があります。
私はgetInfo関数から約束を返さないのでエラーが発生しますが、返すはずの方法や約束がわかりません。
私はこれにいくつかの助けに感謝したいと思います。おかげ
私はベストプラクティスが何であるか(あるいは答えがすでにあるかどう)最後の夜だけで、この問題に遭遇したと好奇心旺盛です。 – ssube
@ssube最も簡単なアプローチは、すべてのデータが収集されたら、約束してコードをラップしてからresolve()を呼び出すことです。私の場合、Promise.all(...)の中からラッパーの約束のためにresolve()を呼び出しました。それはAhmedの答えのように見えます。 –