通过函数组件呈现异步承诺

Rendering async promises through function components

抱歉,如果 post 重复,我只是找到 class 组件的示例。

我有这个代码:


    export const getUniPrice = async () => {
        const pair = await Uniswap.Fetcher.fetchPairData(HOKK, Uniswap.WETH[ETH_CHAIN_ID]);
        const route = new Uniswap.Route([pair], Uniswap.WETH[ETH_CHAIN_ID]);
        const priceUni = route.midPrice.toFixed(9);
        return priceUni
    }

它确实有效,请回答我的承诺对象:


[[PromiseState]]: "fulfilled"
[[PromiseResult]]: "1106278.001628948"

我想知道的是,我怎样才能正确地使用这个对象,以便能够通过函数组件来渲染它?我正在做类似这样的事情,但显然行不通,因为 React 不渲染对象。

const Price = () => {
    const { state, dispatch } = useContext(AppContext);
    return(<>
        {state.dex === 'uni' ? getUniPrice() : state.dex === 'cake'
            ? getCakePrice() : getMDexPrice()
    }
    </>)
 } 

有人可以给我提示吗?这个函数 运行 在函数组件之外,所以我不能只使用 useState

你是对的。 getUnitPrice() 的结果是一个 Promise,而不是一个值,所以 React 所做的是打印出该 Promise 的字符串化版本。如果您需要已完成的值,则需要一个状态值,该状态值将 re-render 页面更新。像这样:

const [price, setPrice] = useState('');

useEffect(() => {
  getUnitPrice().then((p) => setPrice(p));
}, []);

...

<div>Price: {price}</div>

如果您使用的是 class 组件,您可以像这样初始化状态:

state = {
  price: '',
}
async componentDidMount() {
  const p = await getUniPrice();
  this.setState({ price: p });
}