Firebase cloud function promises

前端 未结 2 1490
有刺的猬
有刺的猬 2020-12-22 09:48

I\'m having a hard time getting a promise chain to flow correctly in a firebase cloud function. It loops through a ref and returns an array of emails for sending out notific

2条回答
  •  离开以前
    2020-12-22 10:29

    The following should do the trick.

    As explained by Doug Stevenson in his answer, the Promise.all() method returns a single promise that resolves when all of the promises, returned by the once() method and pushed to the promises array, have resolved.

    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)
      });
    
    })
    

提交回复
热议问题