Создание функции, которая возвращает обещание и обрабатывает обратный вызов - PullRequest
0 голосов
/ 07 сентября 2018

Вот мой код:

function getUserRatingsSorted(userIds) {
  return Promise.all(userIds.map(id => {
    return admin.database().ref().child('users').child(id).on('value', (s) => {
      const user = s.val();
      user.id = id;
      return user;
    });
  }));
}
function prepareGameForStart(userIds) {
  getUserRatingsSorted(userIds)
  .then((users) => evaluateUsersByRatings(users))
  .then((playerAndRatings) => distributePlayersInTeams(playerAndRatings))
  .then(notification.sendPushNotificationTo('Teams have been selected', 'Log in to your group to see your team', userIds))
  .catch((error) => {
    console.log(error);
  });
}

Когда я регистрирую пользователей в первых , затем я получаю

[[Функция], [Функция], [Функция], [Функция]]

, и он срабатывает до того, как пользователи извлекаются из базы данных. Поэтому, если я console.log(user) в функции getUserRatingsSorted, они будут напечатаны после регистрации пользователей . Для меня это звучит неправильно, так как вещи в обещании должны быть напечатаны, тогда вещи в , а затем . Я считаю, что я делаю что-то не так в создании функции обещания.

1 Ответ

0 голосов
/ 07 сентября 2018

on () не возвращает обещание (как вы можете видеть из связанных документов API). Он слушает до бесконечности, пока вы не удалите слушателя. Вместо этого используйте Once () , чтобы выполнить один запрос, который возвращает обещание, указывающее, что запрос выполнен, и содержит моментальный снимок данных.

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