Как избежать вложения обещаний в этом случае с помощью Firebase Cloud Functions? - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть приложение для Android, которое отправляет список телефонных номеров в облачную функцию в моем проекте.Затем сервер должен получить список всех телефонных номеров пользователей, получить пересечение (одинаковые элементы) между двумя массивами, а затем отправить обратно в приложение идентификатор пользователя Firebase Auth пользователей в массиве пересечений.

Вот что я придумал: -

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const auth = admin.auth();
const _ = require('underscore');

exports.getUids = functions.https.onCall((data, context) => {
    return auth.listUsers().then(userRecords => {
        var allPhoneNumbers = [];
        userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
        var phoneNumbers = _.intersection(allPhoneNumbers, data);
        var Uids = [];
        //the next line is where I am nesting promises
        phoneNumbers.forEach(phoneNumber => auth.getUserByPhoneNumber(phoneNumber).then(user => Uids.push(user.uid)));
        return Uids;
    }).catch(error => console.error(error));
});

Я никогда не программировал на JavaScript, но пытаюсь.Прошло уже 2 дня, и я просто не могу понять, как обойти это.Я пробовал как минимум 10 разных способов.Мне действительно трудно справиться с обещаниями.Любая помощь приветствуется.

1 Ответ

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

Вы можете использовать Promise.all, чтобы избежать этой проблемы.Обратите внимание, что звонки на getUserByPhoneNumber не ждут завершения.Вы должны связать обещание ждать его.Вот реализация с обычным Promise:

return auth
  .listUsers()
  .then(userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    return Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );
  })
  .then(users => {
    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });

Вот реализация с async / await:

return auth
  .listUsers()
  .then(async userRecords => {
    var allPhoneNumbers = [];
    userRecords.users.forEach(user => allPhoneNumbers.push(user.phoneNumber));
    var phoneNumbers = _.intersection(allPhoneNumbers, data);

    const users = await Promise.all(
      phoneNumbers.map(phoneNumber => auth.getUserByPhoneNumber(phoneNumber))
    );

    return users.map(user => user.uid);
  })
  .catch(error => {
    console.error(error);
  });
...