【发布时间】:2021-12-30 02:44:14
【问题描述】:
所以我已经做了几个月的 React-Native 了,我偶然发现了一个很大的块必须在 setState 函数中更新的情况。之后我不得不调用一个依赖于该状态的函数。 当然,状态并没有立即发生变化,因为我了解到 setState 是异步的。
这是我的结构
父母
stateSetter = (data) => {
this.setState({
...data
})
}
dateFilter = () => {
let startDate = this.state.startDate
let endDate = this.state.endDate
if (startDate !== "" && endDate == "") {
this.setState({
DataFiltered: this.state.Data.filter(elem => Helper.convertDateToISO(elem.date)>= Helper.convertDateToISO(startDate))
})
}else if(startDate == "" && endDate !== ""){
this.setState({
DataFiltered: this.state.Data.filter(elem => Helper.convertDateToISO(elem.date)<= Helper.convertDateToISO(endDate))
})
}else if(startDate !== "" && endDate !== ""){
this.setState({
DataFiltered: this.state.Data.filter(elem => Helper.convertDateToISO(elem.date)>= Helper.convertDateToISO(startDate) && Helper.convertDateToISO(elem.date)<= Helper.convertDateToISO(endDate))
})
}else if(startDate === "" && endDate === ""){
this.setState({
DataFiltered: this.state.Data
})
}
}
孩子
<TouchableWithoutFeedback onPress={async () => {
await stateSetter({
["startDate"]: "",
["endDate"]: "",
["startDateText"]: "From...",
["endDateText"]: "To..."
})
dateFilter()
}} >
现在我相信 Async Await 仅在 await 等待承诺时才起作用.....对吗? 所以按照这个逻辑,在上述代码中,await 和 async 应该对程序没有影响。
完全相反
当我不使用异步等待时,它不起作用。它仅在我使用异步等待时才有效。
当我刚刚学习异步时,我尝试了几件事,但都没有奏效。
this.setState({ ...data }, () => {
this.dateFilter()
})
//Had no effect
另外:承诺没有效果。
TlDr:为什么我的 Async Await 工作正常?
【问题讨论】:
-
“当我不使用异步等待时,它不起作用。” - 什么不起作用?我无法真正理解你的问题。顺便说一句,如果您在非承诺值前面使用
await,这就像用Promise.resolve包装该值:await 123----->await Promise.resolve(123) -
我必须查看规范才能确认,但我相信
await总是会以某种方式将函数其余部分的评估推迟到事件循环的下一个滴答声,到那时状态已更新。然而,我认为这是糟糕的设计,因为代码或多或少取决于这种隐藏的行为。您的最后一个示例应该看起来应该有效,并且也是我推荐的方式。 -
@FelixKling 我不太了解 OP 的问题,但在阅读了您的评论后,我相信 OP 会询问为什么
dateFilter函数在等待stateSetter呼叫时看到更新状态?!如果是这样,即使使用await,dataFilter函数也不应该看到更新的状态,因为状态在特定渲染中是恒定的。 -
@Yousaf:这是一个类组件。使用
await将安排this.dataFilter()在下一个tick 中被调用,并且状态可能在下一个microtick 中更新,即在dataFilter被调用之前。 -
@FelixKling 啊,对。完全错过了
this.setState的使用。
标签: javascript reactjs react-native ecmascript-6 es6-promise