Функция Firestore с Promises.all занимает очень много времени, чтобы завершить - PullRequest
0 голосов
/ 11 июня 2019

Итак, я новичок в javascript и уверен, что код не идеален. Я сталкиваюсь с некоторыми проблемами при получении данных из Firestore.

Функция personalMessage занимает около 50 секунд, и я понятия не имею, почему она так долго. Этот код в быстром будет возвращаться из базы данных менее 1000 мс.

Также рекомендуются любые указатели в стиле кода.

enter image description here

function sendMessageToDevice(token, payload, options) {
  admin.messaging().sendToDevice(token, payload, options)
    .then(response => {
      console.log('Successfully sent message:', response, response.results[0].error);
      return response
    })
    .catch(error =>  console.log('Error sending message:', error));
}

function getUser(userId) {
    return admin.firestore().collection('users').doc(userId).get()
        .then(snapshot => {
            if (!snapshot.exists) {
                console.log('No such document!');
                return null;
            }
            return snapshot.data()
        })

        .catch(err => {
            console.log('Error getting document', err);
            return err;
        });
}


exports.personalMessage = functions.firestore
    .document('/messages/{id}')
    .onCreate((snapshot, context) => {
      var messageData = snapshot.data();
      var userId = messageData.user;
      var fromId = messageData.from;

      Promise.all([getUser(userId), getUser(fromId)])

      .then(([dataA, dataB]) => {
          console.log(dataA.fcmToken, dataB.name);


          var payload = {
             notification: {
                 title: dataB.name + ' messaged you.',
                 body: 'Go check it out it',
                 clickAction: 'NEW_PERSONAL_MESSAGE'},
             data: {
                 messageId: context.params.id}
             };

          var options = {
              contentAvailable: false,
              priority: 'high'
          }

          return sendMessageToDevice(dataA.fcmToken, payload, options);
      })



      .catch(error =>  console.log('Error sending message:', error));

      return Promise.resolve('success');
});

1 Ответ

1 голос
/ 11 июня 2019

Как говорит Дуг о неверных обещаниях.Я немного изменил ваш код.Тем не менее, сообщение может прийти не сразу по какой-то причине, например по сети, ...

function sendMessageToDevice(token, payload, options) {
    return admin.messaging().sendToDevice(token, payload, options)

}

function getUser(userId) {
    return admin.firestore().collection('users').doc(userId).get()

}


exports.personalMessage = functions.firestore
    .document('/messages/{id}')
    .onCreate((snapshot, context) => {
      var messageData = snapshot.data();
      var userId = messageData.user;
      var fromId = messageData.from;

      return Promise.all([getUser(userId), getUser(fromId)])
      .then(result=> {

            if (!result[0].exists || !result[1].exists) {
                console.log('No such document!');
                return null;
            }
            return [result[0].data(),result[1].data()]
        }) 
      .then(([dataA, dataB]) => {
          console.log(dataA.fcmToken, dataB.name);


          var payload = {
             notification: {
                 title: dataB.name + ' messaged you.',
                 body: 'Go check it out it',
                 clickAction: 'NEW_PERSONAL_MESSAGE'},
             data: {
                 messageId: context.params.id}
             };

          var options = {
              contentAvailable: false,
              priority: 'high'
          }

          return sendMessageToDevice(dataA.fcmToken, payload, options);
      })
      .then(response => {
          console.log('Successfully sent message:', response, 
               response.results[0].error);
          return Promise.resolve('success');
      }) 
      .catch(error =>  console.log('Error sending message:', error));

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