【问题标题】:Google Cloud Functions Promises execution and return谷歌云函数承诺执行和返回
【发布时间】: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


【解决方案1】:

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

  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 函数调用之后的代码可以在数组的每个元素处理完成之前执行。

【讨论】:

  • 嗨,科尔班!这实际上是有道理的,并解释了记录结果。 :) 那么问题是:如何让代码在继续之前等待 forEach() 完成? :D /K
  • 我怀疑这篇文章可以回答lavrton.com/…
  • 在您的逻辑中,您似乎在为数组中的每个元素做“某事”。您已要求通过将 forEach 回调标记为“异步”来异步执行此“某事”。如果您从 forEach 回调中删除“async”标签,则回调将同步处理数组中的每个元素,并且整个 forEach 将在每个元素被处理之前不会结束。我的“直觉”是说“只需从 forEach 回调中删除异步修饰符”。
  • 是的!删除“异步”有效!非常感谢 (^__^)/ /K
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 2017-07-01
  • 2019-09-23
  • 2017-05-20
  • 2019-06-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多