【问题标题】:Array length is 0 while it has items数组长度为 0,但它有项目
【发布时间】:2017-08-07 22:19:01
【问题描述】:

我在这个例子中用测试数据填充了一个数组,所以我知道 Firebase 数据不是罪魁祸首。

this.lastMessages = new Array();

ref.limitToLast(1).on("child_added", (snapshot) => {
   this.zone.run(() => {
       this.lastMessages.push("test");
   });
});

console.log(this.lastMessages);
console.log(this.lastMessages[1]);
console.log(this.lastMessages.length);

在此示例中,我只是将值“test”推入 lastMessages 数组以使其更容易。现在我在底部有 3 个日志,结果很奇怪。

第一个按预期记录:

[]
0: "test"
1: "test"
2: "test"
length: 3
__proto__: Array(0)

第二个日志返回未定义,最后一个日志返回 0 作为长度。我通过推送值来确保它不会变得具有关联性。现在不可能是因为它在区域中运行,因为第一个控制台日志给了我正确的表示。怎么回事?

【问题讨论】:

  • 什么是ref.limitToLast(1)
  • 这是对 firebase 的调用,为我提供了 firebase 数据库模型的最后一个条目。在此示例中,我没有对 firebase 数据做任何事情,但仍然显示该函数,因为它确实在其中推送值
  • 附注:请注意this 的嵌套箭头功能。箭头函数将 this 引用绑定到词法范围,这可能是嵌套箭头函数的问题。
  • 您的 on("child_added"... zone.run(...) 是否有可能在您的 console.log() 之后运行?看起来这是一个事件驱动的系统,这取决于在它之后的代码之前运行的事件。

标签: javascript arrays angular firebase


【解决方案1】:

这是预期 ayncsync 和显示参考数组的 chrome 开发人员工具的组合。

ref.limitToLast(1).on 使整个“添加”过程异步,这意味着当您记录数组时,其中还没有元素,因为异步部分尚未触发。通过在this.lastMessages.push 上方放置console.log 来检查它。您将看到“添加”的日志记录是在数组记录之后完成的

它确实显示 3 个项目的原因是浏览器优化。阅读here了解更多详情

【讨论】:

  • 很好的答案,确实它在函数本身中起作用。您知道如何将它绑定到函数内的 this.lastMessages 以便它显示在我的模板中吗?
  • 你能把你的整个@Component贴出来吗?
  • 有什么方法可以聊天吗?我的组件很大。
  • 我已经开始chat
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2018-01-05
  • 2019-07-19
  • 1970-01-01
  • 2017-11-10
  • 2014-07-27
  • 2019-01-31
  • 2021-12-01
相关资源
最近更新 更多