Firebase 的云函数:序列化 Promise
Posted
技术标签:
【中文标题】Firebase 的云函数:序列化 Promise【英文标题】:Cloud Functions for Firebase: serializing Promises 【发布时间】:2017-08-10 01:35:48 【问题描述】:在 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.");
)
);
);
上述方法有效,但不确定其正确方式...
【问题讨论】:
我很好奇你为什么要请求/zzz/2
,而你从不使用snaps[1]
...?
这只是一个测试 - 不要介意检索数据的实际(错误)使用(或使用硬编码 uid 的丑陋事实 :)
另请注意,您从onWrite
回调返回的承诺已解决在结束时的update
完成。如果这不是故意的,您需要创建一个 Promise,从 then
返回它,然后在 update
回调中解决它。
@T.J.Crowder 我很想看看它是如何完成的一个例子。谢谢。
好吧,我无法真正回答您提出的问题(我不知道 Firebase 何时终止查询)。如果你想问一个关于 Promise 的问题,我可以回答。基本上在then
内,你会做return new Promise((resolve, reject) => /*...your current 'then' code here...*/);
并从update
回调中调用resolve
(或reject
)。
【参考方案1】:
如果您的函数在返回后继续执行(或您的函数返回的承诺已解决),Google Cloud Functions可能随时中断您的代码。但是,不能保证它会立即这样做。
在您的代码示例中,您返回最终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 的承诺,它为 GCF 提供信息,让您的函数在需要时精确运行。
【讨论】:
啊!错过了一个回报。谢谢! :) 另外,想知道哪个标签与 firebase-functions 一起使用,谢谢。 是的,命名很混乱。对于那个很抱歉。也可以在这里查看我的解释:***.com/questions/42854865/… 我用的是event.data.adminRef.root.child('/x')
,但是这里可以用admin.database().ref('/x')
吗?以上是关于Firebase 的云函数:序列化 Promise的主要内容,如果未能解决你的问题,请参考以下文章
Firebase 云函数错误:函数返回未定义、预期的 Promise 或值
Firebase 的云函数 - getaddrinfo ENOTFOUND