在Cloud Functions中操作Firestore写入数据时是否需要使用await?
关于Cloud Functions中Firestore操作是否需要加await的解答
结论先行
await语句对执行稳定性有决定性的帮助,不会产生无意义的额外CPU时长消耗,是必须保留的写法。
为什么不能省略await直接返回
Cloud Functions的运行机制决定了:只要你调用response.send()返回响应、或者函数执行完成退出,平台会立刻冻结当前函数实例的所有运行进程,未完成的异步操作会直接被中断。
如果你省略await直接返回,你发送的Firestore更新请求大概率还没完成网络传输、或者还没被Firestore服务端确认就被中断,最终会出现大量数据更新丢失的问题,尤其是在函数冷启动、实例负载低频繁销毁的场景下,数据写入成功率会极低。
错误写法示例:
exports.badExample = functions.https.onRequest(async (request, response)=> { // 未加await直接发起异步操作,后续会被中断 db.collection('users').doc(request.body.userID).update({ username: request.body.username }) response.send({done: true}) return ; })
关于CPU时长消耗的疑问
Cloud Functions的CPU计费时长仅统计代码实际运行占用CPU的时间,你加await后等待Firestore服务端返回的这段时间属于IO等待状态,不会计入CPU计费时长,完全不用担心额外开销。
如果不想让用户等待写入完成怎么办
如果你确实需要降低接口响应时长,不想等Firestore写入完成再返回,不能直接省略await处理,正确的做法是将更新任务投递到Cloud Tasks或者Pub/Sub队列中,交由后台异步任务处理写入逻辑,保证数据更新的可靠性。
内容的提问来源于stack exchange,提问作者Bee Taylor
相关产品推荐
相关产品推荐

