代码:
onDragEnd = {
(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate })
.then(() => alert("hello"))
}
执行以下代码时,我收到此错误:
undefined is not an object evaluating
('_this.setState({playerMarkerPositionFuture: event.nativeEvent.coordinate}).then')
如果我删除了承诺,那么一切都会按预期进行,这意味着我很可能以错误的方式使用了承诺:
onDragEnd={
(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate })
}
答案 0 :(得分:11)
setState
接受回调,但不返回承诺。 See docs
对setState的调用是异步的-调用setState后,不要立即依赖this.state来反映新值。如果您需要根据当前状态计算值,请传递更新器函数而不是对象(有关详细信息,请参见下文)。
(event) => {
this.setState({playerMarkerPositionFuture: event.nativeEvent.coordinate }, () => alert("hello"));
}
答案 1 :(得分:5)
setState不返回Promise。它很可能是void函数。
答案 2 :(得分:5)
在setState完成后,不要使用promise来调用警报,而应使用回调
onDragEnd={(event) =>
this.setState({
playerMarkerPositionFuture: event.nativeEvent.coordinate
}, () => {
alert("hello")
})}
答案 3 :(得分:4)
onDragEnd={(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate }).then(() => alert("hello"))}
这是使用setState()方法的错误做法。您只能通过setState()
使用回调。
正确做法:
onDragEnd={(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate },()=>{
alert("hello")
})
看看这篇文章:
https://medium.com/@voonminghann/when-to-use-callback-function-of-setstate-in-react-37fff67e5a6c
答案 4 :(得分:4)
setState()并不总是立即更新组件。它可能会批量更新或将更新推迟到以后。这使得在调用setState()之后立即读取this.state可能是一个陷阱。而是使用componentDidUpdate或setState回调(setState(updater,callback)),确保在应用更新后均能触发这两种方法。
https://reactjs.org/docs/react-component.html#setstate
所以您可以在状态更改后使用setState(updater, callback)
来执行代码,以便保存
答案 5 :(得分:4)
如果您想使用promise ...可能是另一种解决方法
setStateAsync(state) {
return new Promise((resolve) => {
this.setState(state, resolve)
});
}
并使用它...
this.setStateAsync(
{playerMarkerPositionFuture: event.nativeEvent.coordinate}
)
.then(() => alert("hello"))
答案 6 :(得分:3)
尝试一下
onDragEnd={(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate },() => alert("hello"))}