私はBluebirdの約束をどのように使用するかを習得しようとしており、少し失われています。約束を返す関数で非同期的にコレクションをマッピングする
私は2つのデータベーステーブル:topic
とsubject
を持っています。
topic
テーブルにはsubject_id
というカラムがあり、これを使用してsubject
テーブルに対象タイトルを問い合わせることができます。
私はorm
を非同期にクエリし、約束を返します。
最終的に私は当初topic
クエリから返されたオブジェクトの配列の各要素に、その後のsubject
のクエリから返されたsubject_title
を注入する、あなたのためのルックアップを行い話題のモデルメソッドを記述しようとしています。
Promise.map
を使用しようとしていますが、これは機能しません。以下のコードは動作しません。私はそれを期待したことはありませんでしたが、私は達成しようとしているものの本質を捉えていると思います。
[subject_id, title, description]
そしてsubject
オブジェクトがあります:
[id, title]
は、私は上記の関数はオブジェクトの配列を返すようにしたい
var promise = orm.select({
db: db,
table: 'topic',
where: args.where,
order: args.order,
limit: args.limit,
offset: args.offset,
group: args.group
}).map(function (topic) {
var promise = orm.select({
db: db,
table: 'subject',
qrm: 'one',
where: {id: topic.subject_id}
}).then(function (subject) {
topic.subject_title = subject;
});
return promise;
});
return promise;
ので、仮定バニラtopic
オブジェクトは、プロパティを持っていること以下の特性を有する:
[subject_id, subject_title, title, description]
これを行う最もクリーンな方法は何ですか?トップレベルの約束のfullfilled値が変更され話題オブジェクトの配列でなければなりません
return orm.select({
db: db,
table: 'topic',
where: args.where,
order: args.order,
limit: args.limit,
offset: args.offset,
group: args.group
}).map(function (topic) {
return orm.select({
db: db,
table: 'subject',
qrm: 'one',
where: {id: topic.subject_id}
}).then(function (subject) {
topic.subject_title = subject;
// Add return here so topic stays the fulfilled value
return topic;
});
});
:
なぜ突然変異を避け、新しい物件で新しいオブジェクトを返すのですか? – elclanrs
'orm.select()'は何を返しますか?ブルーバードの約束を返していますか?そして、満たされたデータは何ですか? – jfriend00
@ jfriend00ブルーバードの約束を返します。 fufilledデータはオブジェクトの配列です。配列の各オブジェクトは 'topics'テーブルの行を表します。 – LukeP