我正在编写Firebase云功能,而我正试图弄清楚Promise.all
的工作原理。在我的代码中,我传递array of database queries并尝试read the resulting array,但我只是垃圾:
T {
A:
P {
k: Sb { Ka: [Function: vb], ba: [Object] },
aa: P { k: [Object], aa: null, wb: [Object], Bb: '' },
wb: Zc { ld: [Object], ac: [Object] },
Bb: null },
V:
R {
u:
Gd {
app: [Object],
L: [Object],
Ua: [Object],
Sc: null,
ca: [Object],
td: 1,
Qa: [Object],
va: [Object],
qg: [Object],
jc: [Object],
ee: [Object],
md: [Object],
ia: [Object],
Xa: [Object],
cd: 2,
fe: null,
K: [Object] },
path: J { o: [Object], Y: 0 },
m:
Df {
xa: false,
ka: false,
Ib: false,
na: false,
Pb: false,
oa: 0,
kb: '',
bc: null,
xb: '',
Zb: null,
vb: '',
g: Tc {} },
Kc: false,
then: undefined,
catch: undefined },
g: Tc {} }
我期待一个简单的json:
{
"name": "Foo",
"number": 2521
// And a few other fields
}
顺便说一下,我看了Jen's video所以我知道我做的事情无论如何都是错的。我只是想知道为什么我现有的代码不起作用。 (我还没有对它进行测试,但我相信解决方案是在我的数据库查询中返回原始快照,然后进行.val()
调用。)
链接消失后的相关代码:
function mergeTeams(duplicates) {
return Promise.all([
admin.database().ref(someRef).once('value', (snap) => {
return snap.val();
}),
admin.database().ref(someRef2).once('value', (snap) => {
return snap.val();
})
]).then(values => {
console.log(values);
const team1 = values[0];
const team2 = values[1];
console.log(team1);
console.log(team2);
}
答案 0 :(得分:1)
所以,这是有效的代码(以及下面的解释):
return Promise.all([
admin.database().ref(teamRef + duplicates.teamKey1).once('value'),
admin.database().ref(teamRef + duplicates.teamKey2).once('value')
]).then(values => {
const team1 = values[0].val();
const team2 = values[1].val();
console.log(team1);
console.log(team2);
});
它起作用的原因是因为我总是在values
数组中得到承诺,即使我不知道它。这是Promise.all
返回的内容:一个数组,其中传递了promises的原始结果。当我在success callback内部返回内容时,实际上并没有做任何事情,因为它不是承诺的一部分;我只是将随机的东西归还给空洞。当我打印团队时,我实际上是记录了Firebase Snapshot
对象而不是.val()
。