Запрос Firestore в функции return - PullRequest
0 голосов
/ 22 июня 2019

У меня есть массив в Firestore, который я хотел бы использовать во многих местах. Лучше всего было бы иметь функцию с возвратом, как это:

function getWarehousesArray() {


    let db = firebase.firestore();
      var user = db.collection("users").doc(firebase.auth().currentUser.email);
      var warehousesArray = new Array();
      return user.get()
        .then(function (doc) {
          if (doc.exists) {

            warehousesArray = doc.data().warehouses_array;
            return warehousesArray

          } else {
            swal("Error!", "No such document!", "error");
          }
          //return warehousesArray
        }).catch(function (error) {
          swal("Error!", error, "error");
        });

    }

и далее:

var warehouses = getWarehousesArray();

К сожалению, это не работает

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Большое спасибо. Рабочая функция:

async function myFunction() {
  var warehouses = await getWarehousesArray();
...
0 голосов
/ 22 июня 2019

Поскольку данные из Firestore, возможно, должны поступать с сервера, они загружаются асинхронно. Значение, которое вы возвращаете из getWarehousesArray, - это не фактический массив хранилищ (поскольку оно не будет доступно к моменту запуска return user...), а Promise из этих значений.

Чтобы получить актуальный список складов, вы можете использовать async / await (если вы используете современный JavaScript):

var warehouses = await getWarehousesArray();

Вам нужно будет пометить функцию, содержащую этот код, как async, как показано в этой статье MDN для async / await.


В качестве альтернативы для более старых сред вы можете просто развернуть обещание:

getWarehousesArray().then(function(warehouses) {
    console.log(warehouses);
    ... anything that uses warehouses needs to be inside this callback
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...