将setState与诺言一起使用后出现错误

时间:2019-05-09 11:14:27

标签: javascript react-native

代码:

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 })
}

7 个答案:

答案 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"))}