gpt4 book ai didi

javascript - Firebase 云功能 promise

转载 作者:行者123 更新时间:2023-12-03 01:19:26 25 4
gpt4 key购买 nike

我很难让 Promise 链在 Firebase 云函数中正确流动。它循环访问 ref 并返回一组电子邮件以发送通知。它有一些嵌套的子级,我认为这就是我出错的地方,但我似乎找不到错误。

/类(class)结构

{
123456id: {
..
members: {
uidKey: {
email: some@email.com
},
uidKey2: {
email: another@email.com
}
}
},
some12345string: {
// no members here, so skip
}
}

function.js

exports.reminderEmail = functions.https.onRequest((req, res) => {
const currentTime = new Date().getTime();
const future = currentTime + 172800000;
const emails = [];

// get the main ref and grab a snapshot
ref.child('courses/').once('value').then(snap => {
snap.forEach(child => {
var el = child.val();

// check for the 'members' child, skip if absent
if(el.hasOwnProperty('members')) {

// open at the ref and get a snapshot
var membersRef = admin.database().ref('courses/' + child.key + '/members/').once('value').then(childSnap => {
console.log(childSnap.val())
childSnap.forEach(member => {
var email = member.val().email;
console.log(email); // logs fine, but because it's async, after the .then() below for some reason
emails.push(email);
})
})
}
})
return emails // the array
})
.then(emails => {
console.log('Sending to: ' + emails.join());
const mailOpts = {
from: 'me@email.com',
bcc: emails.join(),
subject: 'Upcoming Registrations',
text: 'Something about registering here.'
}
return mailTransport.sendMail(mailOpts).then(() => {
res.send('Email sent')
}).catch(error => {
res.send(error)
})
})
})

最佳答案

下面的内容应该可以解决问题。

正如 Doug Stevenson 在他的回答中所解释的,Promise.all()方法返回一个 promise ,当 once() 返回所有 promise 时,该 promise 将得到解决。方法并推送到promises数组,已解决。

exports.reminderEmail = functions.https.onRequest((req, res) => {
const currentTime = new Date().getTime();
const future = currentTime + 172800000;
const emails = [];

// get the main ref and grab a snapshot
return ref.child('courses/').once('value') //Note the return here
.then(snap => {
const promises = [];

snap.forEach(child => {
var el = child.val();

// check for the 'members' child, skip if absent
if(el.hasOwnProperty('members')) {
promises.push(admin.database().ref('courses/' + child.key + '/members/').once('value'));
}
});

return Promise.all(promises);
})
.then(results => {
const emails = [];

results.forEach(dataSnapshot => {
var email = dataSnapshot.val().email;
emails.push(email);
});

console.log('Sending to: ' + emails.join());
const mailOpts = {
from: 'me@email.com',
bcc: emails.join(),
subject: 'Upcoming Registrations',
text: 'Something about registering here.'
}
return mailTransport.sendMail(mailOpts);
})
.then(() => {
res.send('Email sent')
})
.catch(error => { //Move the catch at the end of the promise chain
res.status(500).send(error)
});

})

关于javascript - Firebase 云功能 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51827392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com