Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.06.2019, 13:03
Аспирант
Отправить личное сообщение для gsdev99 Посмотреть профиль Найти все сообщения от gsdev99
 
Регистрация: 03.02.2019
Сообщений: 72

Как правильно получить асинхронные данные?
Всем привет. Подскажите, пожалуйста, как правильно получить асинхронные данные?
У меня есть класс, который запрашивает данные:
import fb from 'firebase/app';
import 'firebase/database';

class Ad {
  constructor(firstName, type, userNumber, id = null) {
    this.firstName = firstName;
    this.type = type;
    this.userNumber = userNumber;
    this.id = id;
  }
}

class DataService {
  constructor() {
    this.data = null;

    this.init();
  }

  init() {
    const config = {
      apiKey: 'AIzaSyBtvzZlxD_TLwsoE2kMZUMRPnFgz20RyjA',
      authDomain: 'javascript-app-8804a.firebaseapp.com',
      databaseURL: 'https://javascript-app-8804a.firebaseio.com',
      projectId: 'javascript-app-8804a',
      storageBucket: 'javascript-app-8804a.appspot.com',
      messagingSenderId: '916390243341',
      appId: '1:916390243341:web:d93322ea53d50bae'
    };

    fb.initializeApp(config);
  }
  
  fetchAds = () => {
    fb.database()
      .ref('users')
      .once('value')
      .then((fbVal) => {
        const ads = fbVal.val();

        const resultAds = [];

        Object.keys(ads).forEach(key => {
          const ad = ads[key];

          resultAds.push(
            new Ad(ad.firstName, ad.type, ad.userNumber, key)
          )
        });

        console.log('resultAds', resultAds);

        this.data = resultAds;

        return this.data;
      })
      .catch((e) => {
        console.log(e);
      });
  }
}

const instance = new DataService();
export default instance;


В другом классе, где мне нужны методы для получения данных, я вызываю необходимый метод. Он у меня срабатывает раньше, соответственно и данные туда не приходят.
Что я делаю не так?
export default class Users {
  constructor(el) {
    this.el = el;

    this.init();
  }

  init() {
    const data = dataService.fetchAds();
    console.log('data', data);
  }
}
Ответить с цитированием
  #2 (permalink)  
Старый 25.06.2019, 15:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от gsdev99
Что я делаю не так?
Асинхронное получение данных, как правило, обрабатывают в калбек-функциях, которые запускаются после получения данных.
А не в вызывающих запрос функциях/методах...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JQuery Autocomplete Как получить данные, вводимые пользователем в поле? decadent42 jQuery 7 30.10.2015 21:55
initComponent: Как получить данные родителя и как получить store для вызова load()? Пролетарий ExtJS 76 04.07.2015 09:22
Как правильно записать данные в JSON Alex_D181 Angular.js 1 19.06.2015 13:01
как правильно обращаться к свойствам объект внутри самого объекта ? mitiya Общие вопросы Javascript 12 25.04.2015 21:18
Как получить данные формы Moonlight Angular.js 0 24.10.2014 11:12