使用Firebase返回数组

尝试查找使用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); } 

该问题发生在getPosts()中。 它将一个承诺放到一个asynchronous函数中的数组中 – 这将不起作用,因为在添加承诺对象之前调用了q.all。

而且,child_added是一个实时事件通知。 因为没有“全部”这样的东西,所以不能用它来获取“所有的数据”。 数据在实时环境中不断变化。 FirebaseIndex也在内部使用了child_addedcallback函数,所以也不能用这个用例。

您可以使用'value'callback(但不是logging的特定子集)抓取所有post,如下所示:

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

但现在是时候考虑实时环境的问题了。 最有可能的是,没有理由在工作之前需要“全部”数据。

考虑只抓取每条logging,并将它们附加到需要存储的任何DOM或数组,并从事件驱动的模型而不是以GET / POST为中心的方法进行工作。

幸运的是,你完全可以绕过这个用例。