【发布时间】:2020-04-06 13:22:22
【问题描述】:
我希望运行 Google Cloud 维护功能来更新 Firebase 实时数据库。 代码非常简单,但由于某种原因,执行在所有代码运行之前完成。 我怀疑我的 await 呼叫没有按预期处理,因为我错过了使用 .once()?
exports.setUserLimits = functions
.region('europe-west1')
.database
.ref('/NO-TRIGGER')
.onCreate(async (snapshot, context) => {
let myPromises = []
const userNodeSnap = await database.ref('users').once('value')
console.log('numChildren', userNodeSnap.numChildren())
userNodeSnap.forEach(async (userSnap) => {
console.log('Process user', userSnap.key)
const userData = userSnap.val()
//Set user limits
const limits = {items:10, logins:1}
console.log('New limits', limits)
myPromises.push(userSnap.ref.update({limits}))
})
// Execute all promises
console.log('myPromises lenght', myPromises.length)
return Promise.all(myPromises)
.then(()=>{
return Promise.resolve()
})
.catch((err)=>{
console.error('Could not execute all promises', err)
// Show must go on!
return Promise.resolve()
})
})
从 Google Cloud Functions 注销
setUserLimits Function execution started
numChildren 4
Process user 1234567890
myPromises lenght 0
Function execution took 416 ms, finished with status: 'ok'
New limits {items:10, logins:1}
执行提前结束,导致只有一条记录被更新。
将最后几行替换为下面会产生相同的结果
await Promise.all(myPromises)
/K
【问题讨论】:
-
您是否尝试过“等待”您的 Promise.all()?该函数不必返回任何内容,只需将“await Promise.all()”包裹在 try-catch 块中即可捕获任何错误。
-
嗨,可怕的大小!对不起,同样的结果。 /K
标签: javascript firebase-realtime-database google-cloud-functions es6-promise