arrays - 异步访问 Firebase 中的数组

标签 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');
})
此代码从 firebase 获取用户的 token ,我只想浏览 token 数组。
这是控制台给我的:
enter image description here
如您所见,我无法访问该数组。你知道我该怎么做吗?
提前致谢。

最佳答案

欢迎来到异步加载 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 加载。

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

该解决方案由 AngularFire 以 promise 的形式提供。 AngularFire promise 在 future 的某个时候为您提供数据。如果你有一段代码应该只在加载数据时执行,你可以这样写:
  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只会触发一次,它只会记录数组的初始内容。如果您只是想查看数据是否/何时加载,惯用的方法是添加 userTokens范围:
$scope.userTokens = userTokens;

并将其添加到您的 View /HTML:
<pre>{{ userTokens | json }}</pre>

AngularFire 现在将监视用户 token 何时以任何方式加载或修改,并在发生这种情况时告诉 AngularJS 更新 View 。

另见这些:
  • Firebase, AngularJS and GeoFire - wait for response from factory
  • Firebase angularfire child.$asObject give properties undefined
  • angularfire - why can't I loop over array returned by $asArray?
  • Passing variable in parent scope to callback function
  • Trying to get child records from Firebase

  • 是的......我们经常收到这个问题。

    关于arrays - 异步访问 Firebase 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27049342/

    相关文章:

    c - 保存然后打印出 C 中二维数组中的字符串

    javascript - REACT NATIVE REDUX 如何在 Action 创建者收到的reducer中设置数组

    python - 可以使用 AngularJS+Flask 堆栈来完成推送通知吗?

    javascript - 在 AngularJs 中使用服务通过 $http get 获取数据

    firebase - 从firebase客户端sdk获取user_pseudo_id?

    javascript - 带有数组javascript的下拉列表选项值和名称

    javascript - 将多维javascript数组转换为JSON?

    javascript - 如何使用 $timeout 在指令渲染后调用 Controller 方法?

    java - 将图像上传到 firebase 存储需要权限吗?如何?

    java - 如何在 Firestore 中更改文档而不出现字符串错误?