Firebase中对阵列的异步访问

Vic*_*ico 17 arrays angularjs firebase ionic-framework

这是我的代码:

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');
})
Run Code Online (Sandbox Code Playgroud)

这段代码从firebase获取用户的标记,我只想浏览标记数组.

这是控制台给我的东西:

在此输入图像描述

如您所见,我无法访问该阵列.你知道我怎么能这样做吗?

提前致谢.

Fra*_*len 23

欢迎使用异步加载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');
Run Code Online (Sandbox Code Playgroud)

此代码段的第一行开始从Firebase加载您的数据.但这种加载可能需要一些时间.由于浏览器不想阻止事物,因此它继续执行脚本.

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

当它进入for循环时,数据可能已经或可能尚未从Firebase加载.

在某些时候,您单击了记录旁边的箭头userTokens.到那时,数据已从Firebase加载,控制台显示最新数据.

解决方案由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');
Run Code Online (Sandbox Code Playgroud)

更新

请注意,以上是何时使用的不良示例$loaded.由于$loaded只会触发一次,它只会记录数组的初始内容.如果您只是想查看是否/何时加载了数据,那么惯用的方法是添加userTokens到范围:

$scope.userTokens = userTokens;
Run Code Online (Sandbox Code Playgroud)

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

<pre>{{ userTokens | json }}</pre>
Run Code Online (Sandbox Code Playgroud)

AngularFire现在将监视何时以任何方式加载或修改userTokens,并且如果发生这种情况,将告诉AngularJS更新视图.

另见这些:

是的......我们得到了很多这个问题.

  • 你很受欢迎凯尔.很高兴被欣赏(不仅仅是赞成).但是帮助人们使用和理解许多很酷的技术也很简单. (4认同)