作者:Horizonfeng_121 | 来源:互联网 | 2023-02-08 16:03
在onWrite处理程序中,我想执行多次读取,操作一些数据,然后存储它.我是Promise概念的新手.我对以下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> Frank van Pu..:
如果您的函数在返回后继续执行(或函数返回的承诺已解决),Google云端功能可能会随时中断您的代码.但是无法保证它会立即这样做.
在您的代码示例中,您将返回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 的承诺,它为其提供了让您的函数正常运行的信息,只要它需要.