Javascript 很晚才更新状态,刚刚计算了控制台错误值。如何解决

Javascript 很晚才更新状态,刚刚计算了控制台错误值。如何解决,javascript,reactjs,Javascript,Reactjs,我完全搞不懂这里发生了什么。我正在REACT中设置状态,但更新很晚。下面是函数 fetchTimesheets() { const userId = cryptInfo.decrypt(localStorage.getItem('user_id')) var userArray = [] var timeSheets = [] fetchManagerProject(userId) .then(async (res) => { c

我完全搞不懂这里发生了什么。我正在REACT中设置状态,但更新很晚。下面是函数

fetchTimesheets() {
    const userId = cryptInfo.decrypt(localStorage.getItem('user_id'))
    var userArray = []
    var timeSheets = []
    fetchManagerProject(userId)
      .then(async (res) => {
        const projects = await res.json()
        projects.forEach(project => {
          project.teammember && project.teammember.forEach(member => {
            if (userArray.indexOf(member.user) === -1) {
              userArray.push(member.user)
              fetchUserTimelogs(member.user)
                .then(async (res) => {
                  const timesheet = await res.json()
                  if (timesheet)
                    timesheet.forEach(sheet => {
                      timeSheets.push(sheet)
                    });
                })
            }
          })
        })

        this.setState({
          timesheets: timeSheets
        })
      })

  }

我在componentDidMount方法上调用此函数


但我得到的是,我的值刚刚被评估,状态没有更新。有人能帮忙吗?我已经看到了许多与此相关的问题,但没有得到很好的解决。

我相信函数fetchTimesheets是同步运行的,您可以将函数定义更改为async,然后将方法调用为Wait fetchTimesheets。

您是否检查过是否是您正在发出的请求花费了很长时间,还是设置状态本身

FetchTimesheet在循环forEach上包含多个http请求,根据请求的不同,完成这些请求可能需要一些时间。因为forEach循环是一个阻塞函数,这意味着在forEach函数执行完成之前不会调用setState函数

<> P>为了加速这一点,您可以考虑每次获得新的时间表时将时间表设置为状态。比如说

fetchManagerProject(userId)
    .then(async (res) => {
    const projects = await res.json()
    projects.forEach(project => {
        project.teammember && project.teammember.forEach(member => {
        if (userArray.indexOf(member.user) === -1) {
            userArray.push(member.user)
            fetchUserTimelogs(member.user)
            .then(async (res) => {
                const timesheet = await res.json()
                if (timesheet)
                timesheet.forEach(sheet => {
                    timeSheets.push(sheet)
                });
                const newTimesheet = this.state.timesheets.concat(timesheet);
                this.setState({timesheets: newTimesheet});
            })
        }
        })
    })
})

只是为了添加正在运行的函数的作用域,在更新状态时时间表数组不是空的?这是否回答了您的问题?
fetchManagerProject(userId)
    .then(async (res) => {
    const projects = await res.json()
    projects.forEach(project => {
        project.teammember && project.teammember.forEach(member => {
        if (userArray.indexOf(member.user) === -1) {
            userArray.push(member.user)
            fetchUserTimelogs(member.user)
            .then(async (res) => {
                const timesheet = await res.json()
                if (timesheet)
                timesheet.forEach(sheet => {
                    timeSheets.push(sheet)
                });
                const newTimesheet = this.state.timesheets.concat(timesheet);
                this.setState({timesheets: newTimesheet});
            })
        }
        })
    })
})