【问题标题】:"Promise{<pending>}" in console instead of a value控制台中的“Promise{<pending>}”而不是值
【发布时间】:2020-11-29 08:35:21
【问题描述】:

我正在尝试将一个从文件 (.src/api/index.js) 中的 api 获取数据的函数导入我的 App.js (.src/App.js)。

.src/api/index.js

import axios from 'axios';

const url = 'https://covid19.mathdro.id/api';

export const fetchData = async () => {
    try {
        const res = await axios.get(url);
        return res;
    } catch (error) {}
};

.src/App.js

import React, { useEffect } from 'react';
import { fetchData } from './api';

const App = () => {
    useEffect(() => {
        const data = fetchData();
        console.log(data);
    }, []);

    return <div></div>;
};

export default App;
};

当我运行此程序时,我在控制台中收到Promise{&lt;pending&gt;},但我正在尝试获取对象中的值。

【问题讨论】:

    标签: javascript reactjs api promise


    【解决方案1】:

    fetchData()是一个异步函数,你需要像这样await它:

    const data = await fetchData();
    

    那么,useEffect 也必须是一个异步函数:

    useEffect(async () => {
            const data = await fetchData();
            console.log(data);
        }, []);
    

    【讨论】:

    • 除非没有async 使用等待
    • @PatrickRoberts 哦,对了,对不起。 Something 必须是 `async,即围绕调用的函数。
    • React 建议我不要在 useEffect(async () => { 之后使用“异步”
    • 您也可以将 await 包装在立即调用的函数表达式中,如下所示:medium.com/javascript-in-plain-english/…@Oluwajolasun
    【解决方案2】:

    你不是在等待承诺解决。使用 await 或 .then。如果你想使用await,请做useEffect异步函数的回调函数。

    const App = () => {
        useEffect(async () => {
            const data = await fetchData();
            console.log(data);
        }, []);
    
        return <div></div>;
    };
    

    其他方法是使用.then。

    const App = () => {
        useEffect(async () => {
            const data = fetchData().then((data) => console.log(data));
        }, []);
    
        return <div></div>;
    };
    

    【讨论】:

    • 不知道为什么这被否决了...这是第一个指出 useEffect() 回调需要异步的答案,在撰写本文时这不是多余的信息。跨度>
    • React 建议我不要在 useEffect(async () => { 之后使用“异步”
    • 我添加了第二种方法。对于哪个 react 不会给你任何警告。
    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 2018-07-14
    相关资源
    最近更新 更多