Каково поведение наблюдаемого в цикле forEach? - PullRequest
0 голосов
/ 25 марта 2019

При запросе наблюдаемой в цикле forEach создается ли новый "экземпляр" наблюдаемой в каждом цикле или перезаписывается ли существующая наблюдаемая, если запрос следующего цикла запрашивается до того, как предыдущая наблюдаемая возвращает значение?

Например, если у меня есть сообщения для отправки моим пользователям, мне нужно запросить все их устройства и отправить на все устройства.Пример темы в массиве тем, которая передается в createTopics(topics):

Отдельный элемент в массиве тем

{
    "submission": {
      "id": 52,
      "artistID": 111,
      "title": "Sego Sucks",
      "Artist": {
        "name": "Sego"
      }
    },
    "users": [
      {
        "id": 7,
        "userUID": "ZvOBNBqxbgRYoibSYEwkL9YKtWG2"
      }
    ]
  }

Мой вопрос: когдаЯ запускаю цикл forEach, у меня есть наблюдаемое в findUserDevices, которое действительно очень быстро повторяется несколько раз, будет ли моя наблюдаемая «перезаписана» следующим циклом, если он не вернет значение до того, как произойдет следующий цикл?До сих пор, когда я запускаю этот код, он выполняется как запланировано, но я не уверен, является ли это наилучшим способом обработки наблюдаемого в качестве моих масштабов данных, и в каждой теме больше пользователей, особенно с учетом того, что pushToDevices() является асинхронной функцией.

function createTopics(topics) {
    topics.forEach((topic: any) => {
        const message = {
            notification: {
                title: `New music from ${topic.submission.Artist.name}!`,
                body: `Listen to "${topic.submission.title}" now`
            }
        }

        topic.users.forEach((user) => {
            findUserDevices(user.userUID, message);
        })
    })
}

function findUserDevices(uid: string, message) {
        collectionData(fb.firestore().collection('devices').where('userId', '==', uid)).subscribe((devices: any) => {
            var userDeviceTokens: string[] = devices.map((device: any) => device.token);
            if (userDeviceTokens.length != 0) {
                message['tokens'] = userDeviceTokens;
                pushToDevices(message);
            }
        })
}

async function pushToDevices(message) {
    await admin.messaging().sendMulticast(message).then((response) => {
        console.log('done!')
    })
}

Спасибо за понимание!

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