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()
我努力实现的目标是:
非常感谢任何帮助 他们发现这样一个问题的关键是将代码减少到再现问题所需的最小值。瞧,你好,弗兰克凡帕夫伦!感谢您的反馈!我试图简化代码,以更好地显示调用的结构。您需要返回一个承诺,该承诺在函数中所有异步工作完成时解决。现在,您正在使用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)
})
}