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

时间:2018-09-18 13:04:07

标签: javascript reactjs callback setstate

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

this.setState({ anyState }, this.anyFunction()); 该函数已被调用,但是在状态更新后才真正被调用。结果,由于我还在anyState中更新相同的anyFunction,所以两个状态更新之间存在某种冲突,只有第一个状态有效。

然后我发现我必须要么做

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

两个

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

使事情正常运行。

为什么这样?为什么我的第一种方法不对?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

this.anyFunction使用

返回常量"some_text"
this.setState({ anyState }, this.anyFunction());

与使用

相同
this.setState({ anyState }, "some_text");

在第二个示例中,您实际上传递了一个回调。或函数作为参数。该函数尚未执行,它将在setState()的末尾执行。

有关异步编程和回调的更多信息,您可以观看此谈话:https://javascript-conference.com/javascriptecmascript/asynchronicity-concurrency/