【问题标题】:Why does returning snapshot.val() in a Promise when using Promise.all not work?为什么在使用 Promise.all 时在 Promise 中返回 snapshot.val() 不起作用?
【发布时间】:2017-04-27 02:12:37
【问题描述】:

我正在编写一个 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);
}

【问题讨论】:

  • 你没有展示你是如何使用Promise.all - 可能是错误的(把相关代码放在问题中)
  • 是的,我做了,单击名为“数据库查询数组”的链接。或点击这里:github.com/SUPERCILEX/Robot-Scouter/blob/…
  • 不,相关代码应该在问题中
  • 我认为你需要做一些类似admin.database().ref(teamRef + duplicates.teamKey2).once('value').then(snap => snap.val()) 的事情——因为,好吧,promise 就是这样工作的
  • 看,你使用回调的方式意味着回调中返回的值与任何东西都没有关系(它被忽略了)

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


【解决方案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 返回的内容:传入的promise 的原始结果数组。当我在success callback 中返回东西时,实际上并没有做任何事情,因为它不是promise 的一部分;我只是将随机的东西归还给一个空虚的空间。当我打印团队时,我实际上是在记录 Firebase Snapshot 对象而不是 .val()

【讨论】:

  • “我猜这是 JS 的东西”可能不正确。您是否有描述 once 如何使用两个参数的文档参考?
  • @Traktor53 哦,是的。那会更有意义,让我研究一下。
  • @Traktor53 谢谢,我想我现在真的明白了!是的,当我返回东西时,它在 Firebase 的成功回调中,与 JS Promise 无关。
  • 太棒了。仅供参考,根据stackoverflow.com/q/43431330/5217142,您可能一直在记录快照对象本身 - 一个承诺不能履行承诺,因此values 数组中不会有一个。
  • @Traktor53 是的,我意识到这一点并更新了我的答案。还是谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多