1

Node.jsFirebase を使用するときに Q ライブラリ (または同様のライブラリ、私は部分的ではありません)でデータの配列を返す最適な使用例を見つけようとしています.on("child_added")

使用してみましQ.all()たが、約束が満たされるのを待ってから戻ることはないようです。これは私の現在の例です:

function getIndex()
{
    var deferred = q.defer();

    deferred.resolve(new FirebaseIndex( Firebase.child('users').child(user.app_user_id).child('posts'), Firebase.child('posts') ) );

    return deferred.promise;
}

function getPost( post )
{
    var deferred = q.defer();
    deferred.resolve(post.val());
    return deferred.promise;
}

function getPosts()
{
    var promises = [];          

    getIndex().then( function (posts) {
        posts.on( 'child_added', function (_post) {
            promises.push( getPost(_post) );
        });
    });
    return q.all(promises);
}
4

1 に答える 1

3

問題は getPosts() で発生します。非同期関数内の配列に promise をプッシュします。これは、promise オブジェクトが追加される前に q.all が呼び出されるため機能しません。

また、child_added はリアルタイムのイベント通知です。「すべて」というものはないため、「すべてのデータ」を取得する方法としてそれを使用することはできません。データはリアルタイム環境で常に変化しています。FirebaseIndex も内部で child_added コールバックを使用しているため、このユース ケースでも機能しません。

次のように、「値」コールバックを使用してすべての投稿を取得できます (特定のレコードのサブセットではありません)。

function getPosts() {
   var def = q.defer();
   Firebase.child('users').once('value', function(snap) {
      var records = [];
      snap.forEach(function(ss) {
         records.push( ss.val() );
      });
      def.resolve(records);
   });
   return def.promise;
}

しかし、この時点で、リアルタイム環境の観点から物事を検討する時が来ました。ほとんどの場合、作業を開始する前に「すべての」データが存在する必要があるわけではありません。

入ってきた各レコードを取得し、格納する必要がある DOM または配列に追加し、GET/POST 中心のアプローチではなくイベント駆動型モデルから作業することを検討してください。

運が良ければ、このユース ケースを完全に回避できます。

于 2013-07-03T21:43:57.543 に答える