Правильно объединенные функции в функции Firebase - PullRequest
0 голосов
/ 06 февраля 2019

Я создаю функцию в Firebase Cloud Functions, которая может использовать модули Node.js.

Я все еще новичок в использовании .then(), и я изо всех сил пытаюсь найти способ объединить в цепочку мои 3 функции webhookSend(), emailSendgrid() и removeSubmissionProcessor(), которые происходят сразу после 'count' увеличивается (оператор if, который проверяет temp_shouldSendWebhook).Сама идея возврата обещаний до сих пор меня немного смущает, особенно когда речь идет о внешних библиотеках.

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

const request = require('request');

const firebaseConfig = JSON.parse(process.env.FIREBASE_CONFIG);
const SENDGRID_API_KEY = firebaseConfig.sendgrid.key;
const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);

exports.submissionProcess = functions.database.ref('/submissions/processor/{submissionId}').onWrite((change, context) => {
  var temp_metaSubmissionCount = 0; // omitted part of function correctly sets the count
  var temp_shouldSendWebhook = true; // omitted part of function correctly sets the boolean

  return admin.database().ref('/submissions/saved/'+'testuser'+'/'+'meta').child('count')
    .set(temp_metaSubmissionCount + 1)
    .then(() => {

      // here is where im stuck
      if (temp_shouldSendWebhook) {
        webhookSend();
        emailSendgrid();
        removeSubmissionProcessor();
      } else {
        emailSendgrid();
        removeSubmissionProcessor();
      }

    })
    .catch(() => {
      console.error("Error updating count")
    });

});

function emailSendgrid() {
  const user = 'test@example.com'
  const name = 'Test name'

  const msg = {
      to: user,
      from: 'hello@angularfirebase.com',
      subject:  'New Follower',
      // text: `Hey ${toName}. You have a new follower!!! `,
      // html: `<strong>Hey ${toName}. You have a new follower!!!</strong>`,

      // custom templates
      templateId: 'your-template-id-1234',
      substitutionWrappers: ['{{', '}}'],
      substitutions: {
        name: name
        // and other custom properties here
      }
  };
  return sgMail.send(msg)
}

function webhookSend() {
  request.post(
    {
      url: 'URLHERE',
      form: {test: "value"}
    },
    function (err, httpResponse, body) {
      console.log('REQUEST RESPONSE', err, body);
    }
  );
}

function removeSubmissionProcessor() {
  admin.database().ref('/submissions/processor').child('submissionkey').remove();
}

Я хочу иметь возможность создавать 3 функции, которые будут вызываться одна за другой, так что они будут всевыполнять.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Для того чтобы связать эти функции в цепочку, каждый из них должен вернуть обещание.Когда они это сделают, вы можете вызывать их последовательно следующим образом:

return webhookSend()
  .then(() => {
    return emailSendgrid();
  })
  .then(() => {
    return removeSubmissionProcessor();
  });

Или параллельно так:

return Promise.all([webhookSend, emailSendgrid, removeSubmissionProcessor]);

Теперь, чтобы ваши функции возвращали обещания:

emailSendgrid: похоже, это возвращает обещание (при условии, что sgMail.send(msg) возвращает обещание), поэтому вам не нужно его менять.

removeSubmissionProcessor: это вызывает функция, которая возвращает обещание, но не возвращает это обещание.Другими словами, он запускает асинхронный вызов (admin.database....remove()), но не ожидает ответа.Если вы добавите return перед этим вызовом, это должно сработать.

webhookSend вызывает функцию, которая принимает обратный вызов, поэтому вам нужно либо использовать fetch (который основан на обещании), а неrequest, или вам нужно преобразовать его, чтобы вернуть обещание, чтобы связать его:

function webhookSend() {
  return new Promise((resolve, reject) => {
    request.post(
      {
        url: 'URLHERE',
        form: {test: "value"}
      },
      function (err, httpResponse, body) {
        console.log('REQUEST RESPONSE', err, body);
        if (err) {
          reject(err);
        } else {
          resolve(body);
        }
      }
    );
  });
}
0 голосов
/ 06 февраля 2019

Используйте асинхронные функции, а затем вы можете использовать .then () или ожидать перед каждым вызовом функции

для справочного чтения this

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