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 的承诺,它为它提供了离开函数的信息 运行只要需要,就可以使用。
在 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 的承诺,它为它提供了离开函数的信息 运行只要需要,就可以使用。