javascript 我应如何访问此承诺结果(React、DataStore、AWS Amplify)

xpcnnkqh  于 2022-12-02  发布在  Java
关注(0)|答案(1)|浏览(150)

遵循本教程https://www.youtube.com/watch?v=QrkkNte1onA&t=742s(2:36:48)。
我正在尝试访问在useState值中找到的承诺:盘子。
下面是我对第三个(也是最后一个useEffect)查询order DataDish的代码(其中包含以下信息:quantity,orderID,orderDishDishId),条件是orderID等于我返回的订单的订单ID。我使用.then()将菜肴设置为一种状态,但在访问菜肴时,菜肴数据(项目名称、价格等)是一种承诺。(见下图)

import {Card, Descriptions, Divider, List, Button} from 'antd';
import { useEffect, useState } from 'react';
import {useParams} from 'react-router-dom';
import {DataStore} from '@aws-amplify/datastore';
import {Order, OrderDish, User} from '../../models';

const DetailedOrder = () => {
    const {id} = useParams();
    const [order, setOrder] = useState(null);
    const [customer, setCustomer] = useState(null);
    const [dishes, setDishes] = useState([]);

    useEffect(() => {
        DataStore.query(Order, id).then(setOrder);
    }, [id]);

    useEffect(() => {
        if(order?.userID) {
            DataStore.query(User, order.userID).then(setCustomer);
        }
    }, [order?.userID]);

    useEffect(() => {
        if(!order?.id){
            return;
        }
        DataStore.query(OrderDish, c => c.orderID.eq(order.id)).then(setDishes);
    }, [order?.id])

    console.log(dishes);

    return (
        <Card title={`Order #${id}` } style={{ margin: 20 }}>
            <Descriptions bordered column={{ lg:1, md:1, sm:1 }}>
                <Descriptions.Item label="Customer">{customer?.name}</Descriptions.Item>
                <Descriptions.Item label="Customer Address">{customer?.address}</Descriptions.Item>
            </Descriptions>
            <Divider />
            <List 
                dataSource={dishes}
                renderItem={(dishItem) => (
                <List.Item>
                    <div style={{fontWeight: 'bold'}}>{dishItem.Dish.name} x{dishItem.quantity}</div>
                    <div>${dishItem.Dish.price}</div>
                </List.Item>
            )}/>
            <Divider />
                <div style={styles.totalSumContainer}>
                    <h2 style={{fontWeight: '400'}}>Total:</h2>
                    <h2 style={styles.totalPrice}>${order?.total?.toFixed(2)}</h2>
                </div>
            <Divider />
            <div style={styles.buttonsContainer}>
                <Button block type='danger' size='large' style={styles.button}>
                    Decline Order
                </Button>
                <Button block type='primary' size='large' style={styles.button}>
                    Accept Order
                </Button>
            </div>
            <Button block type='primary' size='large'>
                Ready For Pickup
            </Button>
        </Card>
    );
};

const styles = {
    totalSumContainer: {
      flexDirection: 'row',
      display: 'flex',
    },
    totalPrice: {
      marginLeft: 'auto',
      fontWeight: 'bold',
    },
    buttonsContainer: {
      display: 'flex',
      paddingBottom: 30,
    },
    button: {
      marginRight: 10,
      marginLeft: 10,
      color: 'white',
    },
  };

export default DetailedOrder;

console.log(dish)在控制台中返回以下内容:

我试图访问在Dish中找到的数据,但这是一个承诺,无法找出如何将其带入状态。
我已经尝试了另一个.then(),但我不能弄清楚它(刚刚开始与javascript)。我读了异步/等待,但我不知道如何实现它。
如果你可能知道但需要更多的信息,请告诉我。我很乐意提供任何必要的信息。这是我在StackOverflow上的第一个问题,要提出一个“好问题”比我想象的要难得多。
Vadim(youtube视频中的家伙)没有遇到这个问题(2:37:08)。我怀疑这是因为更新放大。但我不是100%肯定。
任何信息都将非常感谢。
感谢阅读!

btqmn9zl

btqmn9zl1#

如果要将api调用转换为async,则可以尝试以下方法

useEffect(() => {
 
    const fetchOrder = async () => {
       const orderResponse = await  DataStore.query(Order, id);
       console.log('order', orderResponse);
       setOrder(orderResponse)

       // ideally fetch all data here to avoid unnecessary rerenders
       // and check if the response user is different from previous use to prevent refetch of user
        if(orderResponse?.userID) {
         const customerResponse = await DataStore.query(User, orderResponse.userID);
         console.log('order', customerResponse);
         setCustomer(customerResponse)
         
        }

     if(!orderResponse?.id) {
       const dishResponse = await DataStore.query(OrderDish, c => c.orderID.eq(orderResponse.id));
       console.log('dish', dishResponse);
       setDishes(dishResponse)
    }

    fetchOrder();
   
}, [id]);

我希望这将有助于您调试,以解决您的问题,并编写可维护的代码。
干杯

相关问题