обещание массива цикла foreach не возвращается - PullRequest
1 голос
/ 22 апреля 2019

Я хочу получить доступ к вложенной коллекции под названием «подписчики» из данного идентификатора в «mobile_user», в которой содержатся идентификаторы подписчиков. Я хочу просмотреть все идентификаторы в подколлекции подписчиков и запросить данные из коллекции 'mobile_user'. Обратите внимание, что идентификатор в коллекции «последователи» - это идентификатор другого пользователя в «mobile_user», который содержит данные документа, которые я хочу.

Я безуспешно пытался возиться с обещаниями, я могу выполнить цикл foreach и просто запросить имя в качестве теста, но массив заполняется правильно, но заполненный массив с именами N пользователей никогда не вернулся.

Мне нужна помощь с моим кодом, обещания сводят меня с ума, я не могу их освоить.

const getFollowers = (data, context) => {
        return new Promise((resolve, reject) => {

            let id = data.id
            const mobileUserRef = db.collection('mobile_user')

            return mobileUserRef.doc(id).collection('followers')
                .get()
                .then(function (doc) {
                    var result = []
                    doc.forEach(function (follower) {
                        mobileUserRef.doc(follower.id).get()
                            .then(function (followerdoc) {
                                result.push({
                                    name: followerdoc.data().name,
                                })
                                console.log(result)
                            })
                    })
                    return Promise.all(result);
                })
        });
    }

Ожидаемый результат - массив с данными каждого идентификатора под подписчиком последователей, например:

В этом примере присутствуют только 2 идентификатора пользователя

[ { name: 'Luis' }, { name: 'Marb Rocha' } ]

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

к моменту вызова return Promise.all(result); ничего не выдвигается к result, поэтому обещание разрешается рано без данных.вы можете использовать цепочку для возврата результатов после разрешения всех обещаний, как показано ниже:

const getFollowers = (data, context) => {
    const results = [];

    const id = data.id
    const mobileUserRef = db.collection('mobile_user');

    //return the initial promise, and use chaining to *eventually* return the results
    return mobileUserRef.doc(id).collection('followers')
    .get()
    .then(doc=>{
        //use map to transform the doc results into an array of promises that call each user ref and load the doc
        const promises = doc.map(follower=>{
            return mobileUserRef.doc(follower.id).get()
            .then(followerdoc=>{
                //push items into the results
                results.push({
                    name: followerdoc.data().name,
                })
                return followerdoc;
            })
        })
        //execute all the promises, then return the results
        return Promise.all(promises).then(()=>{
            return results;//return the results, resolving our chain finally
        });
    })

}
1 голос
/ 22 апреля 2019

Вам нужно добавить некоторые обещания в массив, который вы передаете Promise.all(), поэтому я думаю, что вы должны сделать следующее:

  const getFollowers = (data, context) => {
    let id = data.id;
    const mobileUserRef = db.collection('mobile_user');

    return mobileUserRef
      .doc(id)
      .collection('followers')
      .get()
      .then(querySnapshot => {
        var result = [];
        querySnapshot.forEach(follower => {
          result.push(mobileUserRef.doc(follower.id).get());
        });
        return Promise.all(result);
      })
      .then(results => {
        var finalResult = [];
        results.forEach(followerdoc => {
          finalResult.push({
            name: followerdoc.data().name
          });
        });
        return finalResult;
      });
  };

PS: не уверен, почему у вас естьcontext параметр.

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