Javascript 对象的React setState返回未定义的

Javascript 对象的React setState返回未定义的,javascript,node.js,reactjs,iot,Javascript,Node.js,Reactjs,Iot,因此,我为一个物联网项目制作了一个react应用程序,作为3个土壤和空气的温度和湿度图表,我对我的API进行了一次提取,该API返回一个类似于此的JSON响应(但有10个数据值,我没有包括所有数据,以避免这篇文章变得庞大): 关键是我需要在渲染中打印LastTime对象,为此我使用setState属性,但是如果console.log记录ResData,我可以看到我的对象,但是如果我console.logresults它表示未定义。 你可以在我的代码中看到,如果我使用ResData.dados[I

因此,我为一个物联网项目制作了一个react应用程序,作为3个土壤和空气的温度和湿度图表,我对我的API进行了一次提取,该API返回一个类似于此的JSON响应(但有10个数据值,我没有包括所有数据,以避免这篇文章变得庞大):

关键是我需要在渲染中打印
LastTime
对象,为此我使用
setState
属性,但是如果console.log记录ResData,我可以看到我的对象,但是如果我console.log
results
它表示未定义。 你可以在我的代码中看到,如果我使用
ResData.dados[I].T_air
,它根本就没有问题,所以这不是API的错误

import React, { Component } from 'react';
import '../App1.css'
import CanvasJSReact from '../assets/canvasjs.react';
var CanvasJSChart = CanvasJSReact.CanvasJSChart;


var dataPoints =[];
var dataPoints_1 = [];
var dataPoints_2 = [];


class LineChart extends Component {
    constructor(props){
        super(props);
        this.state={
            results: []
        };
    }

.
.
.
.
componentDidMount(){
        var chart = this.chart;
        var chart1 = this.chart1;
        var chart2 = this.chart2;
        fetch('http://localhost:4000/espdata/')
        .then((response) => {
            return response.json();
        })
        .then((ResData) => {
            for (var i = 0; i < 10; i++) {
                var today = new Date(ResData.dados[i].Time);
                dataPoints.push({
                    x: today,
                    y: ResData.dados[i].T_air
                });
                dataPoints_1.push({
                    x: today,
                    y: ResData.dados[i].H_air
                });
                dataPoints_2.push({
                    x: today,
                    y: ResData.dados[i].soil
                });
            }
            chart.render();
            chart1.render();
            chart2.render();
            this.setState({results: ResData.LastTime});
            console.log(this.results);   //UNDEFINED
            console.log(ResData.LastTime) // "12/12/2019, 15:43:53"
        });
    }
.
.
.
.
import React,{Component}来自'React';
导入“../App1.css”
从“../assets/canvasjs.react”导入CanvasJSReact;
var CanvasJSChart=CanvasJSReact.CanvasJSChart;
var数据点=[];
var数据点_1=[];
var数据点_2=[];
类折线图扩展组件{
建造师(道具){
超级(道具);
这个州={
结果:[]
};
}
.
.
.
.
componentDidMount(){
var chart=this.chart;
var chart1=this.chart1;
var chart2=this.chart2;
取('http://localhost:4000/espdata/')
。然后((响应)=>{
返回response.json();
})
。然后((ResData)=>{
对于(变量i=0;i<10;i++){
var today=新日期(ResData.dados[i].Time);
数据点推送({
x:今天,
y:ResData.dados[i].T\u air
});
数据点_1.push({
x:今天,
y:ResData.dados[i].H_air
});
数据点2.push({
x:今天,
y:ResData.dados[i].土壤
});
}
chart.render();
图1.render();
图2.render();
this.setState({results:ResData.LastTime});
console.log(this.results);//未定义
console.log(ResData.LastTime)/“2019年12月12日,15:43:53”
});
}
.
.
.
.

设置状态是一种承诺,如果您需要在设置后立即使用它,您可以 应该用它作为承诺,像这样:

this.setState({results: ResData.LastTime}, () => {console.log(this.state. results); })

设置状态是一种承诺,如果您需要在设置后立即使用它,您可以 应该用它作为承诺,像这样:

this.setState({results: ResData.LastTime}, () => {console.log(this.state. results); })


正常情况下,this.results未定义,这将是this.state.results。但是,设置后不能直接访问state。setState是异步函数@Axnyff所说的是正确的。将其更改为使用this.state.results,您将得到一个空数组,而不是未定义的数组。setState是异步的,因此您无法访问所需的结果中间。1.您必须通过
this.state.results
访问结果。因为我们在state对象内部设置results属性。2.基本上,setState是异步的,因此如果您尝试在下一行中打印,它将返回上一个值(如果没有启动值,则它将是未定义的)。因此,使用回调函数进行进一步的操作。它与Promise非常相似。@Axnyff非常感谢它的工作。我做了{this.state.results}它现在打印时间了!我觉得很傻,因为我没有意识到我必须使用this.state.Thx a lotIt是正常的this.results是未定义的,这将是this.state.results。但是,在设置状态之后,您不能直接访问它。setState是异步函数@Axnyff说的是正确的。将它更改为使用this.state.results,您将得到一个空数组而不是未定义。setState是异步的,因此您无法立即访问所需的结果。1.您必须通过
此.state.results
访问结果。因为我们正在状态对象内设置results属性。2.setState基本上是异步的,因此如果您尝试在下一行中打印,它将返回上一个值(如果没有启动任何值,那么它将是未定义的)。所以使用回调函数进行进一步的操作。它与Promise非常相似。@Axnyff感谢它的工作。我做了{this.state.results}它现在打印时间!我觉得自己很傻,没有意识到我必须使用这个.state.Thx a lotNo,它不是承诺。这不是承诺,是吗?它是异步的,但它不返回承诺或“thenable”是的,很抱歉我错了,它不是承诺,它只是一个异步函数。它起作用了。我错过了this.state和under知道setState是异步的。欢迎。不,这不是承诺。这不是承诺,不是吗?它是异步的,但它不返回承诺或“可启用”是的,很抱歉我错了,这不是承诺,它只是一个异步函数。它起作用了。我错过了this.state,明白了setState是异步的事实.不客气。