在Firebase中对数组进行asynchronous访问

这是我的代码:

var userRef = new Firebase("https://awesome.firebaseio.com/users/"); var tokenRef = userRef.child(key+'/tokens'); tokenRef.once('value', function(snapshot){ var userTokenSync = $firebase(tokenRef); var userTokens = userTokenSync.$asArray(); console.log(userTokens); console.log(userTokens[0]); for(var i=0, len = userTokens.length; i < len; i++) { console.log(userTokens[i]); } console.log('done'); }) 

这段代码从firebase获取用户的令牌,我只想浏览令牌数组。

这是控制台给我的东西:

在这里输入图像描述

正如你所看到的,我无法访问数组。 你有什么想法我可以做到这一点?

提前致谢。

欢迎来到asynchronous加载101。

  var userTokens = userTokenSync.$asArray(); console.log(userTokens); console.log(userTokens[0]); for(var i=0, len = userTokens.length; i < len; i++) { console.log(userTokens[i]); } console.log('done'); 

这段代码的第一行开始从Firebase加载数据。 但是这种加载可能需要一些时间。 而且由于浏览器不想阻塞,它继续执行脚本。

当浏览器执行你的console.log(userTokens); 最有可能的数据还没有被加载。 所以它只是将对象作为占位符打印到控制台。

到达for循环时,数据可能还可能尚未从Firebase加载。

在某个时候,您点击了logging的userTokens旁边的箭头。 到那时,数据已经从Firebase加载,控制台显示最新的数据。

这个解决scheme是由一个承诺的forms提供的AngularFire。 AngularFire承诺在未来的某个时间为您提供数据。 如果你有一段代码只能在数据加载的时候执行,你可以这样写:

  var userTokens = userTokenSync.$asArray(); console.log(userTokens); console.log(userTokens[0]); userTokens.$loaded(function(userTokens) { for(var i=0, len = userTokens.length; i < len; i++) { console.log(userTokens[i]); } console.log('done'); }); console.log('at last line, but not done yet'); 

更新

请注意,以上是使用$loaded时的一个坏例子。 由于$loaded只会触发一次,它只会logging数组的初始内容。 如果你只是想看看你的数据是否被加载,那么惯用的方法是把userTokens添加到范围中:

 $scope.userTokens = userTokens; 

并将其添加到您的视图/ HTML:

 <pre>{{ userTokens | json }}</pre> 

现在,AngularFire将会监控用户触发器何时以任何方式加载或修改,并告诉AngularJS更新视图。

另请参阅:

  • Firebase,AngularJS和GeoFire – 等待工厂响应
  • Firebase的angularfire子。$ asObject给属性undefined
  • angularfire – 为什么我不能循环由$ asArray返回的数组?
  • 将父范围中的variables传递给callback函数
  • 尝试从Firebase获取子logging

是的…我们得到这个问题很多。