2017-07-24 101 views
1

我试图让我的数组的长度,但我总是得到0,即使控制台显示,我把5个OBJETSArray.length等于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) 
})} 

这是控制台显示我 enter image description here

+1

在您的数组被填充之前正在打印...您在异步概念中误导 – guijob

回答

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); 
    }); 
    }); 
} 
+0

非常感谢! ,我不是控制异步功能的主人,很难获得核心思想 –

1

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

1

Ofcourse,你会得到这个,因为这是异步功能,你可以尝试这样的

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); 
}); 
})}