Обещания не выполняются в порядке их вызова - PullRequest
0 голосов
/ 23 мая 2019

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

  1. Сначала я получаю пользователей с помощью функции getUserProfiles.
  2. я подтверждаю каждый идентификатор пользователя, распечатывая каждый индекс напрямую (пользователи [0], пользователи [1], пользователи [2]).
  3. Затем я перебираю каждого пользователя и записываю в журнал идентификатор пользователя до и после запроса к базе данных.
  4. Глядя на журналы консоли, похоже, что идентификаторы пользователя передаются в запрос к базе данных в правильном порядке, но второй идентификатор разрешается до первого идентификатора. первым идентификатором, переданным в базу данных, является 'ZKnqtLVzUqNqdzX9f8ap76LThh32'. Тем не менее, '482uR9t2QEdCUi0Z4nq14VRVhEx1' разрешается первым

Почему идентификаторы не разрешаются в том порядке, в котором они были переданы?

    function getUserProfiles(){
      //get users, usernames and render profiles
        db.getUsers().then(users => {
          console.log('first index:', users[0].id);
          console.log('second index:', users[1].id);
          console.log('third index:', users[2].id);
          users.forEach(user => {
            db.getLatestExperience(user.id).then(()=>{

            })
        })  
    }

    Class {
        getLatestExperience(id, callback) {
          console.log('getLatestExperience before database request:', id);
          return this.experience.where('userID', '==', id).orderBy('start','desc').get().then(snapshot => {            
          console.log('getLatestExperience promise resolved', id);
        })        
      }

     getUsers(callback) {
       return this.users.orderBy('name').get().then(snapshot => {
            return snapshot.docs;
        })
      }
    }


    first index: ZKnqtLVzUqNqdzX9f8ap76LThh32
    second index: 482uR9t2QEdCUi0Z4nq14VRVhEx1
    third index: 7bJBqk2gQBeTIZOY5h3FikO0Yqm2
    getLatestExperience before database request: ZKnqtLVzUqNqdzX9f8ap76LThh32
    getLatestExperience before database request: 482uR9t2QEdCUi0Z4nq14VRVhEx1
    getLatestExperience before database request: 7bJBqk2gQBeTIZOY5h3FikO0Yqm2
    getLatestExperience promise resolved: 482uR9t2QEdCUi0Z4nq14VRVhEx1
    getLatestExperience promise resolved: ZKnqtLVzUqNqdzX9f8ap76LThh32
    getLatestExperience promise resolved: 7bJBqk2gQBeTIZOY5h3FikO0Yqm2

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

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

function getUserProfiles() {
  //get users, usernames and render profiles
  return db.getUsers()
    .then(users => {
      console.log('first index:', users[0].id);
      console.log('second index:', users[1].id);
      console.log('third index:', users[2].id);

      const latestExperiencePerUserPromises = users
        .map((user) => db.getLatestExperience(user.id));

      return Promise.all(latestExperiencePerUserPromises);
    });
}
0 голосов
/ 23 мая 2019

Вы можете поместить обещания в массив и reduce, чтобы они выполнялись последовательно:

const promiseArray = [promise2, promise3...]
    promiseArray.reduce(
        (prev, next) => prev.then(prevResult => next(prevResult)), promise1())
            .then(finalResult => {...})

promiseArray - это массив функций, которые возвращают обещание.Вы пропускаете первый, так как вам нужен стартовый позже.Array.reduce будет выполняться один за другим.prev - это ваше предыдущее обещание, которое вы выполняете, и, при необходимости, для следующего вы можете выполнить его с результатом и передать его следующему.Наконец, в конце вы можете разрешить все снижение одним единственным результатом из последнего обещания.

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