vue踩坑–数据异步请求 (request)

发布于 2024-11-10  0 次阅读




<script>
import Schart from "vue-schart";
import { reactive, ref } from "vue";
import LineChart from "../components/LineChart.vue";
import request from '../utils/request.js';
export default {
    name: "dashboard",
    components: { LineChart, Schart },
    setup() {
        const name = localStorage.getItem("ms_username");
        const radioValue = ref('井深');
        const options2 = {
            type: "line",
            title: {
                text: "钻井数据折线图",
            },
            "labels": [
                "01-12-00:00", "01-12-04:00", "01-12-08:00", "01-12-12:00", "01-12-16:00", "01-12-20:00",
                "01-13-00:00", "01-13-04:00", "01-13-08:00", "01-13-12:00", "01-13-16:00", "01-13-20:00",
            ],
            "datasets": [
                {
                    "label": "井深",
                    "data": [85, 85.09, 262.1, 120.9, 137.1, 230, 240, 245, 260, 275, 195, 235]
                },
                {
                    "label": "钻头位置",
                    "data": [85.00, 85.09, 85.21, 85.32, 85.44, 85.61, 85.65, 85.75, 85.90, 86.04, 86.09, 86.26]
                },
                {
                    "label": "大钩高度",
                    "data": [1.56, 1.55, 1.56, 1.55, 1.55, 85.61, 85.65, 85.75, 85.69, 86.04, 86.09, 86.28]
                },
                {
                    "label": "大钩载荷",
                    "data": [26.21, 26.25, 26.25, 26.58, 26.17, 26.26, 26.40, 25.65, 26.87, 26.54, 26.64, 26.65]
                },
                {
                    "label": "钻压",
                    "data": [37.15, 41.72, 48.19, 15.72, 57.92, 14.17, 14.15, 14.22, 14.22, 14.17, 29.68, 39.01]
                }
            ]
        };
        // 添加控制抽屉显示的响应式数据
        const drawer = ref(false);
        // Reactive data for the charts
        const yAxisData = ref(['2024-11-00', '02:00', '03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00', '10:00', '11:00', '12:00']);
        // const id_井41 = ref([
        //     [980, 455, 1500, 238, 1290, 1457, 1320, 1500, 1600, 1650, 1700, 3000],
        //     [666, 832, 801, 756, 2144, 1130, 1120, 1400, 1500, 1459, 1600, 1750],
        //     [1583, 2315, 2962, 1256, 2260, 1660, 2919, 2627, 2052, 1965, 1669, 1723],
        //     [2571, 2404, 2895, 2341, 2211, 2864, 2217, 1848, 1487, 1653, 1035, 1283],
        //     [1279, 2695, 2342, 2566, 2619, 1670, 2597, 1785, 2911, 1780, 1719, 2670],
        //     [2170, 2308, 2003, 2753, 2013, 1526, 1893, 2345, 2031, 1689, 1604, 1577],
        // ]);
        // const id_井42 = ref([
        //     [1880, 2814, 1597, 1284, 1810, 1739, 2115, 1220, 2231, 2821, 1005, 2508],
        //     [1097, 1984, 1587, 1219, 1971, 1655, 2035, 1929, 1454, 1153, 1705, 1166],
        //     [2681, 2514, 2896, 1123, 1593, 2494, 2699, 1694, 1718, 1885, 1489, 2128],
        //     [2353, 1747, 1584, 2199, 1765, 1488, 2624, 1428, 2335, 1016, 2587, 2702],
        //     [2079, 1114, 2319, 1624, 2143, 2315, 2874, 1641, 2920, 2591, 1657, 2886],
        //     [1705, 1939, 2044, 2770, 1432, 2593, 2394, 2190, 2727, 1449, 1872, 2984],
        // ]);
        const xAxisMax = ref([3000, 3500, 4000, 4500, 5000, 5500]);
        const seriesName = ref(['井深', '钻头位置', '大钩高度', '大钩负荷', '扭矩', '转盘转速']);
        const wellboreId = ref([
            { value: 'id_井41', label: '井41' },
            { value: 'id_井42', label: '井42' },
            ]

        );
        const chartSettings = reactive([{ xData: 'id_井41' }]);
        const charts = ref([]);
        const chartsPropMulti = ref(['井深', '钻头位置', '大钩高度', '大钩负荷', '扭矩', '转盘转速']);
        const optionsPropMulti = ref(
            [ { value: '井深', label: '井深' },
                    { value: '扭矩', label: '扭矩' },
                    { value: '钻头位置', label: '钻头位置' },
                    { value: '大钩高度', label: '大钩高度' },
                    { value: '大钩负荷', label: '大钩负荷' },
                    { value: '转盘转速', label: '转盘转速' },]
            );
        const addChart = () => {
            chartSettings.push({ xData: 'id_井41' });
        };

        const createCharts = () => {
            console.log('chartSettings :' + JSON.stringify(chartSettings));
            charts.value = chartSettings.map(setting => {
                console.log('查询的井id是:'+setting.xData)
                request({
                    url: '/test',
                    method: 'get'
                }).then(data => {
                    console.log('数据库返回值是', data.value);
                    return { xData: data };
                }).catch(error => {
                    console.error('Error fetching data:', error);
                });

                // if (setting.xData === 'xAxisData1') {
                //     return { xData: xAxisData1.value };
                // } else {
                //     return { xData: xAxisData2.value };
                // }
            });
            console.log('charts是'+JSON.stringify(charts));

        };

        const removeChart = (index) => {
            chartSettings.splice(index, 1);
            charts.value.splice(index, 1);
        };

        const fetchDataDemo = () => {
            request({
                url: '/test',
                method: 'get'
            }).then(data => {
                console.log('Data fetched:', data);
            }).catch(error => {
                console.error('Error fetching data:', error);
            });
        };
        return {
            name,
            options2,
            radioValue,
            yAxisData,
            xAxisMax,
            seriesName,
            chartSettings,
            charts,
            addChart,
            createCharts,
            removeChart,
            drawer,
            fetchDataDemo,
            wellboreId,
            chartsPropMulti,
            optionsPropMulti,
        };
    },
};
</script>



控制台输出
chartSettings :[{"xData":"id_井41"}]
Dashboard.vue:236 查询的井id是:id_井41
Dashboard.vue:253 charts是{"_rawValue":[null],"_shallow":false,"__v_isRef":true,"_value":[null]}
数据库返回值是 (6) [Array(12), Array(12), Array(12), Array(12), Array(12), Array(12)] 

从代码和日志来看,charts 数据中的值始终为 null,这意味着你的数据请求 (request) 并没有正确返回或被处理。看起来你的 createCharts 函数中的 request 请求并没有正确处理异步数据,导致 charts.value 为空。你可以使用 async/await 来确保异步请求完成之后再更新 charts。下面是调整后的 createCharts 函数:

const createCharts = async () => {
    console.log('chartSettings :' + JSON.stringify(chartSettings));
    
    const chartDataPromises = chartSettings.map(async (setting) => {
        console.log('查询的井id是:' + setting.xData);
        
        try {
            const data = await request({
                url: '/test',
                method: 'get'
            });
            console.log('数据库返回值是', data.value);
            return { xData: data.value };  // 返回实际数据
        } catch (error) {
            console.error('Error fetching data:', error);
            return { xData: [] };  // 如果请求失败,返回空数据
        }
    });

    // 等待所有数据请求完成
    const chartData = await Promise.all(chartDataPromises);
    charts.value = chartData;  // 更新 charts 数据
    console.log('charts是', JSON.stringify(charts));
};