Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用带有承诺的setState后获取错误_Javascript_React Native - Fatal编程技术网

Javascript 使用带有承诺的setState后获取错误

Javascript 使用带有承诺的setState后获取错误,javascript,react-native,Javascript,React Native,代码: 执行以下代码时,我收到此错误: onDragEnd = { (event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate }) .then(() => alert("hello")) } 如果我取消了承诺,一切都按预期进行,这意味着我很可能以错误的方式使用了承诺: undefined is not an object evaluating ('_this

代码:

执行以下代码时,我收到此错误:

onDragEnd = {
    (event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate })
    .then(() => alert("hello"))
}
如果我取消了承诺,一切都按预期进行,这意味着我很可能以错误的方式使用了承诺:

undefined is not an object evaluating
('_this.setState({playerMarkerPositionFuture: event.nativeEvent.coordinate}).then')

setState不返回承诺。它很可能是一个void函数。

setState
接受回调,但不返回承诺

对setState的调用是异步的-不要依赖this.state在调用setState后立即反映新值。如果需要基于当前状态计算值,请传递更新程序函数而不是对象(有关详细信息,请参见下文)

(事件)=>{
this.setState({playerMarkerPositionFuture:event.nativeEvent.coordinate},()=>警报(“hello”);
}

不要在设置状态完成后使用承诺调用警报,而是使用回调

onDragEnd={
    (event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate })
}

试试这个

onDragEnd={(event) => 
this.setState({ 
    playerMarkerPositionFuture: event.nativeEvent.coordinate 
}, () => {
    alert("hello")
})}
这是使用setState()方法的错误做法。只能使用
setState()
使用回调

正确做法:

onDragEnd={(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate }).then(() => alert("hello"))}
看看这篇文章:

setState()并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得在调用setState()之后立即读取This.state成为一个潜在的陷阱。相反,使用componentDidUpdate或setState回调(setState(updater,callback)),这两种回调都保证在应用更新后触发


因此,您可以使用
setState(updater,callback)
在状态更改后执行代码,如果您想使用promise,可以使用另一种解决方案

onDragEnd={(event) => this.setState({ playerMarkerPositionFuture: event.nativeEvent.coordinate },()=>{
    alert("hello")
})
用这个

setStateAsync(state) {
      return new Promise((resolve) => {
        this.setState(state, resolve)
      });
    }
setStateAsync(state) {
      return new Promise((resolve) => {
        this.setState(state, resolve)
      });
    }
this.setStateAsync(
     {playerMarkerPositionFuture: event.nativeEvent.coordinate}
 )
.then(() => alert("hello"))