Возврат переменной из функции в импортированном модуле - PullRequest
1 голос
/ 02 апреля 2019

Я настраиваю проект Framework7 с помощью веб-пакета и хочу модуль для запросов к базе данных, использующий Firebase.Функция из импортированного модуля выполняется, но запрошенный массив никогда не возвращается / обещание не разрешается.Что я делаю не так?

Я подозреваю, что я либо делаю что-то не так при импорте самого модуля, либо неправильно решаю обещание.Я попытался и потерпел неудачу как с return , так и resol в функции getAllRestaurants в модуле.Я пытался дождаться ответа от вызова базы данных с помощью async / await , .then () и даже с setTimout .Я также попытался просто сказать let array = database.getAllRestaurants () .

database.js (модуль)

  // Initialize Firebase
  import firebase from 'firebase'
  import config from '../config';
  const firebaseApp = firebase.initializeApp(config);
  const db = firebase.firestore(firebaseApp);

//getting array form database

export function getAllRestaurants(){
    //defining db route omitted
    let array = [];
    route.get().then(function(querySnapshot){
        querySnapshot.docs.forEach(function(document){
            array.push(document.data());
        });
        return array; //Have tried with only return and with only resolve
    })
    .resolve(array)  //Have tried with only return and with only resolve
    .catch(function(error){
        console.error('error i firebase getallrestaurants: ', error);
    });
}
//The function getAllRestaurants works and gets the array just fine, so the error is in returning it to the function caller

app.js (main)

//importing my module
import * as database from './database';

//trying to return an array from a function in the module
let array = database.getAllRestaurants(); //returns undefined

//another attempt at getting the same array, .then never executes
database.getAllRestaurants().then((array =>{
  //do stuff
}));

Я ожидал, что код в app.js получит массив из функции, но он получит только 'undefined'

Ответы [ 2 ]

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

Нет возврата в getAllRestaurants. Попробуйте

export function getAllRestaurants(){
    //defining db route omitted
    let array = [];
    return route.get().then(function(querySnapshot){

и пропустите эту строку:

    .resolve(array)  //Have tried with only return and with only resolve
0 голосов
/ 02 апреля 2019

Я бы изменил ваш код на это:

export function getAllRestaurants(){
    // Return a new Promise, which will either resolve a value or reject an error.
    return new Promise(function(resolve, reject){
        //defining db route omitted
      let array = [];
      // Nothing changed here.
      route.get().then(function(querySnapshot){
          querySnapshot.docs.forEach(function(document){
              array.push(document.data());
          });
          resolve(array);
          // Replaced the below line with the one above.
          //return array; //Have tried with only return and with only resolve
      })
      // No need for the line below.
      // resolve(array)  //Have tried with only return and with only resolve
      .catch(function(error){
          console.error('error i firebase getallrestaurants: ', error);
          // Added a line here to reject the error.
          reject(error);
      });
    });
}

Я прокомментировал правки выше. Таким образом, вы всегда получите Promise из этого метода и можете использовать его следующим образом:

//importing my module
import * as database from './database';

database.getAllRestaurants().then(array =>{
  //do stuff
}).catch(err => {
   console.log('an error happened!');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...