我正在编写一个 Firebase Cloud Function,并试图弄清楚 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);
}
最佳答案
所以,这是有效的代码(以及下面的解释):
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 ,即使我不知道。这是 Promise.all
返回的内容:一个数组,其中包含传入的 Promise 的原始结果。当我返回 success callback 内的内容时,这实际上没有做任何事情,因为它不是 promise 的一部分;我只是将随机的东西放回空虚的地方。当我打印团队时,我实际上记录的是 Firebase Snapshot
对象,而不是 .val()
。
关于javascript - 为什么使用 Promise.all 时在 Promise 中返回 snapshot.val() 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43647534/