从React挂钩中的Firebase承诺中获得价值

时间:2019-03-05 21:32:29

标签: javascript reactjs firebase react-hooks

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;

如果我在then上使用了Promise,为什么控制台中没有Promise {}呢?当我在firebase.js中使用console.log()时,我有实际数据。

2 个答案:

答案 0 :(得分:1)

SetBooks正在将书籍的价值设置为承诺。

firebase.getBooks()返回一个承诺。

所以这就是为什么书中有诺言的原因。

你应该做什么

async function fetchMyAPI() {

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

useEffect(() => {
  fetchMyAPI();
}, []);

答案 1 :(得分:0)

您正在处理异步数据,您必须等待承诺解决,然后才能按预期运行。取书需要一段时间,所以会有一个延迟,直到书到达为止,您所拥有的就是保证书最终会到达。

要使其正常工作,您可以尝试:

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