9

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

});

以上工作,但不确定它的正确方式......

4

1 回答 1

9

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

在您的代码示例中,您返回 final 的结果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 的承诺,它为它提供信息,让你的函数在需要时精确地运行。

于 2017-03-18T14:23:24.223 回答