Firebase 的云函数:序列化 Promise

Posted

技术标签:

【中文标题】Firebase 的云函数:序列化 Promise【英文标题】:Cloud Functions for Firebase: serializing Promises 【发布时间】: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)。 【参考方案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 一起使用,谢谢。 是的,命名很混乱。对于那个很抱歉。也可以在这里查看我的解释:***.com/questions/42854865/… 我用的是event.data.adminRef.root.child('/x'),但是这里可以用admin.database().ref('/x')吗?

以上是关于Firebase 的云函数:序列化 Promise的主要内容,如果未能解决你的问题,请参考以下文章

在 Firebase 云函数中批量处理 Promise

Firebase 云函数错误:函数返回未定义、预期的 Promise 或值

Firebase 的云函数 - getaddrinfo ENOTFOUND

Firebase 的云函数 - getaddrinfo ENOTFOUND

Firebase 的云函数:增量计数器

Firebase 云函数 - 返回未定义、预期的 Promise 或值