Firebase的云功能:序列化Promise

时间:2017-03-18 14:08:41

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

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

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

});

以上作品,但不确定其正确的方式......

1 个答案:

答案 0 :(得分:8)

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

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

要解决此问题,请务必从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的承诺,它为其提供了让您的函数正常运行的信息。