我试图创建一个云函数,但在firebase的日志中,它在完成所有任务之前显示“已完成”。
这是我的准则。
export const count = functions.pubsub
.schedule('0 8 * * *')
.timeZone('Europe/Brussels')
.onRun(async context => {
const snapshot = await admin.database().ref('/counter').once('value');
snapshot.forEach( (child) =>
{
var info = child.val();
var dayViews = info['count'];
var ID = child.key;
var ref1 = admin.database().ref('/counter/'+ID);
ref1
.update({
"count": 0,
"totalViews": dayViews,
})
.then(function() {
console.log("Write completed")
}).catch(function(error) {
console.error("Write failed: "+error)
});
});
return 0;
});
我认为问题是函数在完成for each循环之前返回0。
有什么办法解决这个问题吗?
谢谢!
1条答案
按热度按时间toiithl61#
解决方案是在调用return之前等待所有异步
update()
操作完成:因为你使用了forEach()
循环,所以你需要使用Promise.all()
来等待循环中调用的所有异步操作完成,然后才能返回Promise。正如文档(上面的链接)中所解释的那样,
Promise.all()
“通常在启动多个异步任务并发运行并为其结果创建promise之后使用,以便可以等待所有任务完成”。下面的代码应该可以做到这一点:
关于为什么正确处理云函数中的异步操作是关键,我建议您观看Firebase视频系列中关于“JavaScript Promises”的3个视频:https://firebase.google.com/docs/functions/video-series/