Облачные функции Google обещают выполнение и возврат - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть функция обслуживания Google Cloud, которую я хочу запустить sh для обновления базы данных Firebase в реальном времени. Код довольно прост, но по какой-то причине выполнение заканчивается до запуска всего кода. Я подозреваю, что мой ожидающий вызов не обрабатывается должным образом, потому что я неправильно использую .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

1 Ответ

1 голос
/ 06 апреля 2020

Если мы посмотрим на этот блок кода:

  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 может выполнить до завершения обработки каждого элемента массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...