【问题标题】:Returning an Array using Firebase使用 Firebase 返回一个数组
【发布时间】:2013-06-27 20:20:54
【问题描述】:

在使用 Firebase .on("child_added") 时,尝试使用 Q 库(或任何类似库,我不偏袒)在 Node.js 中找到返回数据数组的最佳使用示例;

我尝试过使用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);
}

【问题讨论】:

  • 在 JS 中没有办法在你的代码中“阻塞”。所有 q.all() 将做的就是创建一个新的承诺,当其他一切都完成时完成。不过,它没有办法等待它们完成。 JS 不能那样工作...

标签: node.js firebase q


【解决方案1】:

问题出现在 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 为中心的方法。

如果运气好的话,您可以完全绕过这个用例。

【讨论】:

  • 不确定这段代码是否有效,在我的机器上我必须使用大写的 Q 并承诺不带括号(不使用节点,也许它不同)
  • 在 node 中,在 require 命令中指定名字对象(Q vs q)。
猜你喜欢
  • 2018-04-08
  • 2017-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
相关资源
最近更新 更多