在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
是的…我们得到这个问题很多。