1

Node.js在使用 Firebase 时,试图找到使用 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 推送到一个异步函数内的数组中——这将不起作用,因为 q.all 在添加 Promise 对象之前被调用。

此外, 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 回答