Cloud Functions for Firebase:序列化 Promise

Cloud Functions for Firebase: serializing Promises

在 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.");
        })
    });

});

以上方法有效,但不确定方法是否正确...

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

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

要更正此问题,请确保 "bubble up" 来自 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() 编辑的承诺 return 是 return 编辑到 GCF 的承诺,它为它提供了离开函数的信息 运行只要需要,就可以使用。