Google Cloud Functions 承诺执行和 return

Google Cloud Functions Promises execution and return

我有 Google 云维护功能 我希望 运行 更新 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 云功能注销

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

如果我们看一下这段代码:

  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}))
  })

我们看到它具有以下逻辑形式:

someArray.forEach(async function(element) {
  // do something
});

基本上,forEach函数调用之后的代码可以在数组的每个元素处理完成之前执行。