Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌云功能-承诺导致执行错误_Javascript_Firebase Realtime Database_Google Cloud Functions_Es6 Promise - Fatal编程技术网

Javascript 谷歌云功能-承诺导致执行错误

Javascript 谷歌云功能-承诺导致执行错误,javascript,firebase-realtime-database,google-cloud-functions,es6-promise,Javascript,Firebase Realtime Database,Google Cloud Functions,Es6 Promise,我在谷歌云功能中有一个使用承诺的预定工作。 在第一次执行时,在新部署之后,代码可以工作,但是在第一次执行之后的所有执行都失败了-都是由“测试函数”计划和触发的 我怀疑我的承诺是问题的原因,但我不知道我错在哪里 我的代码结构 googleCloufFunction.onRun() firebaseCall.once().forAll(note) Promise.all(lookupPromise) .then(addNotification) //return Promise.

我在谷歌云功能中有一个使用承诺的预定工作。 在第一次执行时,在新部署之后,代码可以工作,但是在第一次执行之后的所有执行都失败了-都是由“测试函数”计划和触发的

我怀疑我的承诺是问题的原因,但我不知道我错在哪里

我的代码结构

googleCloufFunction.onRun()
  firebaseCall.once().forAll(note)
    Promise.all(lookupPromise)
    .then(addNotification) //return Promise.all(notificationPromises)
    .then(sendEmail) //return Promise.all(sendEmailPromises)
    .then(udpate note)
在第一次执行时,我得到以下日志记录

log('lookupPromises-membersToAlert')

console.log('lookupPromises completed')

console.log('sendmail')

console.log('更新数据库')

第一次执行后,日志在

log('lookupPromises-membersToAlert')

我的代码

exports.notification_email = functions.region('europe-west1')
.pubsub.schedule('0 * * * *').timeZone('Europe/Stockholm')
.onRun((event) => {
  //Search for notes with passed alertDate
  database.ref('notes/').orderByChild('data/alertDate').endAt(moment().valueOf())
  .once('value', (snapshot) => {
    snapshot.forEach( (data) => { 
      //Get membersToAlert and isAlreadyProcessed
      //...

      if (!isAlreadyProcessed) {
        //Get category name
        let lookupPromises = []
        console.log('lookupPromises - category name')
        //Push promise - returns category title for current node
        //...

        //Get membersToAlert email addresses and names
        console.log('lookupPromises - membersToAlert')
        membersToAlert.forEach((memberId, index) => {
          //Push promise - returns an object {userName, userEmail}
        })

        //Perform lookup and promise chain rest of the calls 
        return Promise.all(lookupPromises)
        .then((lookupArray)=>{
          //Collect variables from lookupPromises response
          //...
          console.log('lookupPromises completed')

          //addDbNotification performs and returns Promise.all()
          return addDbNotification(...) //Needs result from lookupPromises
        })
        .then(()=>{
          //Send email 
          console.log('sendEmail')
          //sendMail performs and returns Promise.all()
          return sendEmail(...) //Needs result from lookupPromises
        })
        .then(()=>{
          //Update database
          console.log('update database')
          return dbRef.update( {"sys/sentEmail": true} )
        })
        .catch((err)=>{
          console.log('notification_email Error', err)
          return false
        })

      }//End if (!alreadyProcessed)

      return true
    })//End snapshot.forEach

    return true
  })//End firebase .once()
  .then(()=>{
    return true
  })
  .catch((err)=>{
    console.log("Cronjob error", err)
  })

  // return true
})//End exports.notification_email
addDbNotification

const addDbNotification = () => {
  //This function needs data from "lookupPromises"
  let promises = [] 
  membersToAlert.forEach((memberId, index) => {
    //Push promises to 1. add notification and 2. update counter for each "membersToAlert"
  })
  return Promise.all(promises).catch((err)=>{
    console.log('addDbNotification Error', err)
  })
}
sendMail()

我努力实现的目标是:

  • 查找所有过期票据
  • 处理每个注释
  • 收集每张便笺的“categoryId”和“membersToAlert”
  • 为每个备注的每个“membersToAlert”向数据库写入警报和计数器
  • 向每个备注的“membersToAlert”发送电子邮件
  • 完成后更新数据库中的注释
  • 完成执行和清理
  • 到目前为止,日志显示执行完成得太早

    每小时\u作业通知\u电子邮件[procId]功能执行已开始每小时\u作业通知\u电子邮件

    每小时工作通知电子邮件[procId]开始每小时工作通知电子邮件

    每小时\u作业通知\u电子邮件[procId]函数返回未定义的预期承诺或值

    每小时作业通知电子邮件[procId]功能执行耗时199毫秒,状态为“ok”每小时作业通知电子邮件

    每小时工作通知电子邮件[procId]lookupPromises-类别名称每小时工作通知电子邮件

    每小时工作通知电子邮件[procId]lookupPromises-会员提醒每小时工作通知电子邮件


    非常感谢任何帮助

    他们发现这样一个问题的关键是将代码减少到再现问题所需的最小值。瞧,你好,弗兰克凡帕夫伦!感谢您的反馈!我试图简化代码,以更好地显示调用的结构。您需要返回一个承诺,该承诺在函数中所有异步工作完成时解决。现在,您正在使用once()的回调变量,这使得这变得更加困难。once()返回一个承诺,除了在代码中生成的所有其他承诺之外,还应该使用该承诺。本系列视频可能有助于更好地理解这一点。什么是
    isAlreadyProcessed
    以及您使用它的目的是什么?Hi@jfriend00它是一个标志,用于确定是否应该处理注释。
    const sendEmail = () => {
      //This function needs data from lookupPromises
      let mailPromises = []
      //Push promise to send mail to each "mailRecipientsArray" 
      return Promise.all(mailPromises).catch((err)=>{
        console.log("sendEmail error", err)
      })
    }