javascript - 为什么使用 Promise.all 时在 Promise 中返回 snapshot.val() 不起作用?

标签 javascript firebase firebase-realtime-database es6-promise google-cloud-functions

我正在编写一个 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/

相关文章:

javascript - 缺乏对使用 Play+Scala 与 JavaScript 的实际见解

javascript - 让 jsdoc 和 Crockford 的设计模式相处融洽

ios - 如何从核心数据迁移到Firebase

javascript - 如何在 Ckeditor 中添加字体和字体大小?

javascript - Phaser 3 俄罗斯方 block 克隆,但方 block 不会落地

ios - 使用 Firebase Swift 检索数据

rest - Firestore REST API 数据库监听

Firebase Once() 超时

ios - Firebase:将用户 UID 链接到数据库

android - 我如何将多个数据保存到 firebase 实时数据库中