Javascript 很晚才更新状态,刚刚计算了控制台错误值。如何解决
我完全搞不懂这里发生了什么。我正在REACT中设置状态,但更新很晚。下面是函数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
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});
})
}
})
})
})