在 React Hook 中从 firebase promise 获取价值
Get value from firebase promise in react hook
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 {} 而不是实际值?当我在 firebase.js.
中 console.log() 时,我有实际数据
SetBooks 正在将书籍的价值设定为承诺。
firebase.getBooks() returns 一个承诺。
所以这就是为什么你在书中有一个承诺。
你应该做什么
async function fetchMyAPI() {
const response = await firebase.getBooks();
setBooks(response);
}
useEffect(() => {
fetchMyAPI();
}, []);
您正在处理异步数据,您必须等待承诺解决,然后它才能像您期望的那样工作。拿书需要一段时间,所以会有延迟,直到书到达你所拥有的只是书最终会到达的承诺。
要使其正常工作,您可以尝试:
useEffect(() => {
firebase.getBooks().then(books => setBooks(books))
}, []);
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 {} 而不是实际值?当我在 firebase.js.
SetBooks 正在将书籍的价值设定为承诺。
firebase.getBooks() returns 一个承诺。
所以这就是为什么你在书中有一个承诺。
你应该做什么
async function fetchMyAPI() {
const response = await firebase.getBooks();
setBooks(response);
}
useEffect(() => {
fetchMyAPI();
}, []);
您正在处理异步数据,您必须等待承诺解决,然后它才能像您期望的那样工作。拿书需要一段时间,所以会有延迟,直到书到达你所拥有的只是书最终会到达的承诺。
要使其正常工作,您可以尝试:
useEffect(() => {
firebase.getBooks().then(books => setBooks(books))
}, []);