2016-07-02 8 views
0

私はBluebirdの約束をどのように使用するかを習得しようとしており、少し失われています。約束を返す関数で非同期的にコレクションをマッピングする

私は2つのデータベーステーブル:topicsubjectを持っています。

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

+0

なぜ突然変異を避け、新しい物件で新しいオブジェクトを返すのですか? – elclanrs

+1

'orm.select()'は何を返しますか?ブルーバードの約束を返していますか?そして、満たされたデータは何ですか? – jfriend00

+0

@ jfriend00ブルーバードの約束を返します。 fufilledデータはオブジェクトの配列です。配列の各オブジェクトは 'topics'テーブルの行を表します。 – LukeP

答えて

1

は、あなたがちょうどそれが成就値のままので、あなたの.then()ハンドラから変更topicオブジェクトを返す必要があると思わ。

+0

ああ!そうです、それはうまくいきます。私は一連の結果ではなく、一連の約束事に終わることを前提としていました。 'map'関数は、それを実現するまでのすべての約束を待つことをどのように知っていますか? – LukeP

+0

@LukeP - これはBluebirdの約束で '.map()'がすることです。これは配列を反復してPromise.all()を呼び出すことで、一連の約束を集めるためのショートカットです。それは、その約束を解決する前にすべての約束を明示的に待っています。 [.map()の青い鳥の文書](http://bluebirdjs.com/docs/api/promise.map.html)はとてもうまく説明しています。 – jfriend00

関連する問題