как оценить запрос Firestore перед выполнением следующего lline - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть функция, которая должна возвращать список данных документов из данной коллекции.

function _getPrevActivity(){

let historyCollectionRef =  firestore.collection("/users/RSgNDLPxT2aAERQutXEEyhHHJYk1/agreements/DkRdZ5kHi2g7MlBV3Kjq/test/test-something/records/15/history");
let value = [];
let wait;
    historyCollectionRef.orderBy('timeStamp').onSnapshot(querSnap => {
    querSnap.forEach(doc => {
        value.push(doc.data())
        console.log(value.length, " length")

        })
    console.log(value)
    return value;

    });

return value;

}

Эта функция всегда возвращает [], а затем выполняет запрос пожарного.

PS: я новичок в Node env, возможно, что-то не так с тем, как я написал функцию.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы делаете классическую ошибку при обработке асинхронных вызовов, как при синхронном программировании.

Я реструктурировал ваш код следующим образом:

function _getPrevActivity() {
      let value = [];
      let wait;
      const path = "/users/RSgNDLPxT2aAERQutXEEyhHHJYk1/agreements/DkRdZ5kHi2g7MlBV3Kjq/test/test-something/records/15/history";

      return firestore.collection(path).orderBy('timeStamp')
        .onSnapshot(querSnap => {
          querSnap.forEach(doc => {
            value.push(doc.data())
            console.log(value.length, " length")
          });
          console.log(value)
          return value;
        }).catch(error => {
          console.log(error);
          return value;
        });
    }

    // calling function
    function otherFunc() {
      _getPrevActivity().then(value => {
        // do something with value...
        // value will not be an empty array now
        console.log(value);
      }).catch(console.log);
    }

Ошибка, которую вы здесь делаете, состоит в том, что вы не можете действительно вернуть значение из анонимной функции querSnap => {..., если вы также не вернете вложенное обещание от функции, из которой вы хотите вернуть значение.

Кроме того, для доступа к значению из return асинхронного вызова потребуется использовать условие then(), которое я добавил в код ниже.

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