Javascript 如何在setState(updater[,callback])中正确调用回调?

Javascript 如何在setState(updater[,callback])中正确调用回调?,javascript,reactjs,callback,setstate,Javascript,Reactjs,Callback,Setstate,因此,我一直在努力将回调传递给this.setState(),因为我是这样做的: this.setState({anyState},this.anyFunction()) 调用了该函数,但在状态更新后没有真正调用它。结果,当我在我的anyFunction中更新相同的anyState时,两个状态更新之间存在某种冲突,只有第一个状态更新有效 然后我发现我必须这样做 this.setState({anyState},()=>this.anyFunction()) 或者 this.setState({a

因此,我一直在努力将回调传递给
this.setState()
,因为我是这样做的:

this.setState({anyState},this.anyFunction())
调用了该函数,但在状态更新后没有真正调用它。结果,当我在我的
anyFunction
中更新相同的
anyState
时,两个状态更新之间存在某种冲突,只有第一个状态更新有效

然后我发现我必须这样做

this.setState({anyState},()=>this.anyFunction())

或者

this.setState({anyState},function(){this.anyFunction()})

使事情正常运转


为什么会这样?为什么我的第一种方法似乎是错误的?

第一种方法将调用的结果作为回调传递给
this.anyFunction
。很可能,这不是你想要的

要解决此问题,您需要删除括号,即将代码更改为:

this.setState({ anyState }, this.anyFunction);

但是,这有一个问题,即
anyFunction
中的
this
绑定将不再指向类实例。要解决此问题,您需要将
anyFunction
声明为箭头函数,或者显式绑定
this
第一种方法将调用结果作为回调传递给
this.anyFunction
。很可能,这不是你想要的

要解决此问题,您需要删除括号,即将代码更改为:

this.setState({ anyState }, this.anyFunction);

但是,这有一个问题,即
anyFunction
中的
this
绑定将不再指向类实例。要解决此问题,您需要将
anyFunction
声明为箭头函数,或者显式绑定

在第一个示例中,您使用函数的结果作为第二个参数


this.anyFunction
返回一个常量
“some_text”
,使用

this.setState({ anyState }, this.anyFunction());
与使用相同

this.setState({ anyState }, "some_text");
在第二个示例中,您实际上是在传递回调。或函数作为参数。该函数尚未执行,将在setState()末尾执行


有关异步编程和回调的更多信息,请观看以下对话:

在第一个示例中,您使用函数的结果作为第二个参数


this.anyFunction
返回一个常量
“some_text”
,使用

this.setState({ anyState }, this.anyFunction());
与使用相同

this.setState({ anyState }, "some_text");
在第二个示例中,您实际上是在传递回调。或函数作为参数。该函数尚未执行,将在setState()末尾执行


有关异步编程和回调的更多信息,请观看以下对话:

this.anyFunction()
执行函数
()=>此.anyFunction()
延迟函数执行。由于
setState
需要回调,因此您应该给它一个函数引用,而不是通过
this.anyFunction()
立即执行该函数,该函数将传入this.anyFunction
的任何返回值,或者
undefined
如果没有显式的
return
语句。我猜您一直在调用函数,没有在
this.setState({anyState},this.anyFunction())中传递对它的引用“如何正确调用回调”-这正是问题所在。你应该传递一个回调函数,你不应该自己调用它。谢谢@vlaz,清澈见底。如果可以,把它作为答案,然后我可以验证它。现在清楚多了
this.anyFunction()
执行该函数
()=>此.anyFunction()
延迟函数执行。由于
setState
需要回调,因此您应该给它一个函数引用,而不是通过
this.anyFunction()
立即执行该函数,该函数将传入this.anyFunction
的任何返回值,或者
undefined
如果没有显式的
return
语句。我猜您一直在调用函数,没有在
this.setState({anyState},this.anyFunction())中传递对它的引用“如何正确调用回调”-这正是问题所在。你应该传递一个回调函数,你不应该自己调用它。谢谢@vlaz,清澈见底。如果可以,把它作为答案,然后我可以验证它。现在清楚多了!我认为约束的必要性取决于具体情况。例如,如果
setState
出现在
componentDidmount
或任何其他绑定方法中,则无需在此处绑定
anyFunction
。我认为绑定的必要性取决于具体情况。例如,如果
setState
出现在
componentDidmount
或任何其他绑定方法中,则无需在此处绑定
anyFunction