Получить значение от обещания Firebase в реакции крюка - PullRequest
1 голос
/ 06 марта 2019

firebase.js

import config from "./firebaseConfig";
import app from "firebase/app";
import "firebase/firebase-firestore";

class Firebase {
  constructor() {
    app.initializeApp(config);
    this.db = app.firestore();
  }

  getBooks = () =>
    this.db
      .collection("books")
      .get()
      .then(docs => docs.forEach(doc => doc.data()))
      .catch(err => console.error(err));
}

export default new Firebase();

BookCardsContainer.js

import React, { useState, useEffect } from "react";
import BookCards from "./BookCards";
import firebase from "../../firebase";

const BookCardsContainer = () => {
  const [books, setBooks] = useState([]);

  useEffect(() => {
    setBooks(firebase.getBooks());
  }, []);

  console.log(books);

  return <div />;
};

export default BookCardsContainer;

Почему у меня в консоли Promise {} вместо фактического значения, если я использовал then на Promise? У меня есть фактические данные, когда я console.log () в firebase.js.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

SetBooks устанавливает стоимость книг на обещание.

firebase.getBooks () возвращает обещание.

так вот почему у вас в книгах есть обещание.

Что вы должны сделать

async function fetchMyAPI() {

  const response = await firebase.getBooks();
  setBooks(response);
}

useEffect(() => {
  fetchMyAPI();
}, []);
0 голосов
/ 06 марта 2019

Вы имеете дело с асинхронными данными, вам нужно дождаться выполнения обещания, прежде чем оно будет работать так, как вы ожидаете.Извлечение книг занимает некоторое время, поэтому есть задержка, пока книги не будут доставлены. Все, что у вас есть, - это обещание, что книги будут доставлены в конечном итоге.

Чтобы заставить это работать, вы можете попробовать:

useEffect(() => {
    firebase.getBooks().then(books => setBooks(books))
  }, []);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...