【问题标题】:Cloud Functions for Firebase: serializing PromisesFirebase 的云函数:序列化 Promise
【发布时间】:2017-08-10 01:35:48
【问题描述】:

在 onWrite 处理程序中,我想执行多次读取,操作一些数据,然后存储它。我对 Promise 概念还很陌生。关于 Firebase 不会在我的查询完成之前终止我的查询,我对以下 Promise 处理是否安全?

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => {
    console.log('zzz', event.data.val());

    return Promise.all([
        admin.database().ref('/zzz/1').once('value'),
        admin.database().ref('/zzz/2').once('value')
    ]).then(function(snaps) {
        console.log('loaded', snaps[0].val());
        var updKeys = {
            ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe',
        }

        admin.database().ref().update(updKeys, function(error) {
            console.log("Updating data finished. ", error || "Success.");
        })
    });

});

上述方法有效,但不确定其正确方式...

【问题讨论】:

  • 我很好奇你为什么要请求/zzz/2,而你从不使用snaps[1]...?
  • 这只是一个测试 - 不要介意检索数据的实际(错误)使用(或使用硬编码 uid 的丑陋事实 :)
  • 另请注意,您从onWrite 回调返回的承诺已解决结束时的update 完成。如果这不是故意的,您需要创建一个 Promise,从 then 返回它,然后在 update 回调中解决它。
  • @T.J.Crowder 我很想看看它是如何完成的一个例子。谢谢。
  • 好吧,我无法真正回答您提出的问题(我不知道 Firebase 何时终止查询)。如果你想问一个关于 Promise 的问题,我可以回答。基本上在then 内,你会做return new Promise((resolve, reject) => { /*...your current 'then' code here...*/}); 并从update 回调中调用resolve(或reject)。

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


【解决方案1】:

如果您的函数在返回后继续执行(或您的函数返回的承诺已解决),Google Cloud Functions可能随时中断您的代码。但是,不能保证它立即这样做。

在您的代码示例中,您返回最终then() 的结果。由于您没有从该 then() 块中返回任何内容,因此 GCF 可能会中断对 update() 的调用它可能会继续让代码运行的时间超过所需的时间。

要纠正这个问题,请确保“冒泡”update() 调用中的承诺:

exports.test = functions.database.ref('/zzz/{uid}').onWrite(event => {
    console.log('zzz', event.data.val());

    return Promise.all([
        admin.database().ref('/zzz/1').once('value'),
        admin.database().ref('/zzz/2').once('value')
    ]).then(function(snaps) {
        console.log('loaded', snaps[0].val());
        var updKeys = {
            ["/xxx/" +event.params.uid +"/zoo"]: 'giraffe',
        }

        return admin.database().ref().update(updKeys, function(error) {
            console.log("Updating data finished. ", error || "Success.");
        })
    });

});

在这段代码中,update() 返回的承诺是返回给 GCF 的承诺,它为 GCF 提供信息,让您的函数在需要时精确运行。

【讨论】:

  • 啊!错过了一个回报。谢谢! :) 另外,想知道哪个标签与 firebase-functions 一起使用,谢谢。
  • 是的,命名很混乱。对于那个很抱歉。也可以在这里查看我的解释:stackoverflow.com/questions/42854865/…
  • 我用的是event.data.adminRef.root.child('/x'),但是这里可以用admin.database().ref('/x')吗?
猜你喜欢
  • 2021-06-21
  • 2020-03-31
  • 2018-01-21
  • 2021-05-31
  • 2017-09-14
  • 2020-07-27
  • 2018-06-12
  • 2019-08-06
  • 2018-12-03
相关资源
最近更新 更多