【问题标题】:Array.length equals 0 always [duplicate]Array.length 始终等于 0 [重复]
【发布时间】:2017-07-24 06:35:00
【问题描述】:

我正在尝试获取数组的长度,但即使控制台显示我推送 5 个对象,我也总是得到 0

async function getDiaries() {
 return new Promise((resolve, reject) => {
  var url = firebase.database().ref('/diary');
  var diaries = [];
  url.on('value', (snap) => {
    snap.forEach((child) => {
        diaries.push({
          key: child.key,
          name: child.val().name,
          date: child.val().description,
          url: child.val().url,
          idOwner: child.val().idOwner
        });
    });
});
console.log(diaries.length);// get 0
resolve(diaries)
})}

这是控制台向我显示的

【问题讨论】:

  • 您在数组被填充之前打印...您在异步概念中具有误导性

标签: javascript arrays firebase firebase-realtime-database


【解决方案1】:

url.on 可能是异步的,这意味着您需要在回调中执行console.log

async function getDiaries() {
  return new Promise((resolve, reject) => {
    var url = firebase.database().ref('/diary');
    var diaries = [];
    url.on('value', (snap) => {
      snap.forEach((child) => {
        diaries.push({
          key: child.key,
          name: child.val().name,
          date: child.val().description,
          url: child.val().url,
          idOwner: child.val().idOwner
        });
      });
      console.log(diaries.length); // get 0
      resolve(diaries);
    });
  });
}

【讨论】:

  • 非常感谢! ,我不是控制异步函数的高手,很难理解核心思想
【解决方案2】:

将 console.log 移到你的回调函数中,否则它通常会在你的回调被执行之前运行。换句话说:你得到一个 0,因为此时长度 0。

【讨论】:

    【解决方案3】:

    当然你会得到这个0,因为这是异步功能,你可以这样尝试

    async function getDiaries() {
     return new Promise((resolve, reject) => {
      var url = firebase.database().ref('/diary');
      var diaries = [];
      url.on('value', (snap) => {
        snap.forEach((child) => {
            diaries.push({
              key: child.key,
              name: child.val().name,
              date: child.val().description,
              url: child.val().url,
              idOwner: child.val().idOwner
            });
        });
        console.log(diaries.length);
        resolve(diaries);
    });
    })}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 2017-01-18
      • 2012-01-07
      • 2012-09-02
      • 2021-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多