我正在尝试从另一个函数返回的承诺。这是我的代码:
function getData(){
var result = [];
return new Promise(function(resolve){
var query = firebase.database().ref('groups');
query.once('value').then(data => {
data.forEach(snapshot => {
var gdata = snapshot.val();
var grp = snapshot.key;
result.push(grp);
});
});
resolve(result);
});
}
我设法从上面的函数中打印出'grp'变量的数据。在我的第二个功能中,我试图访问promise中返回的数据:
但是,从第二个函数开始,当我尝试在.then()中打印时,实际上没有打印出任何内容。为什么会这样?
谢谢!
答案 0 :(得分:1)
首先,firebase已经返回一个Promise,因此不需要创建一个新的。您应该将数据放入结果中并直接返回承诺。
function getData() {
var query = firebase.database().ref('groups');
return query.once('value').then(data => {
let res = [];
data.forEach(snapshot => {
var gdata = snapshot.val();
var grp = snapshot.key;
res.push(grp);
});
return res;
});
}
然后您可以简单地链接
function plotData() {
return getData().then(data => {
data.forEach(console.log);
});
}
答案 1 :(得分:0)
你太早解决了这个承诺。但是,如果您不需要,请不要创造新的承诺:
cv2.transform()
答案 2 :(得分:0)
坏消息:如果你需要使用.then()
函数来获取你想要的值(就像你的firebase方法一样),那么你有从你的函数返回一个promise。甚至对于你的内在功能也是如此。
好消息是.then()
可以用来转换"函数的返回值;甚至会为你解开退回的承诺(如果你决定在得到你的答案之前你需要再次进行数据库调用)
function getData(){
var query = firebase.database().ref('groups');
return query.once('value').then(data => {
var result = [];
data.forEach(snapshot => {
var gdata = snapshot.val();
var grp = snapshot.key;
result.push(grp);
});
return result;
});
resolve(result);
}
请注意我return result
函数中的.then()
。由于我返回了.then()
的结果,因此我们将评估一个承诺,而不是纯粹返回data
,将返回result
。
我不太确定你在第二个街区做了些什么。你不应该在getData周围需要Promise.all
或map
,除非你真的打算多次调用它;如果你的清单是空的,似乎根本没有被调用。
答案 3 :(得分:-1)
list.map()没有解决,它不是一个承诺...... Promise.all需要收到一个承诺。
你可能想在那里调用 getData()。