在等待后调用setState时,状态立即可用

Lan*_*vic 9 javascript asynchronous setstate async-await reactjs

在等待另一个功能并将状态记录到控制台后调用setState时,该值立即可用。

我知道setState是异步的,在所有其他情况下,调用它后将不会立即可用(但在setState回调中将可用)

不用等待时使用(预期)

// inital value state is 0
const response = fetchSomething()
this.setState({
  value: 5
})

console.log(this.state.value) // prints 0
Run Code Online (Sandbox Code Playgroud)

与await一起使用

// inital value state is 0
const response = await fetchSomething()
this.setState({
  value: 5
})

console.log(this.state.value) // prints 5
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么?

Tho*_*lle 5

当您创建一个函数async并执行await一些表达式时,将在等待的诺言在后台解决后运行以下语句。

文档指出setState()并不总是立即更新组件,通常也不会,但是在这种情况下,当您在事件处理程序中解决了承诺后更新状态时,状态将立即更新。

class App extends React.Component {
  state = {
    value: 0
  };

  asyncClick = () => {
    Promise.resolve().then(() => {
      this.setState({
        value: 5
      });

      console.log(this.state.value);
    });
  };

  syncClick = () => {
    this.setState({
      value: 5
    });

    console.log(this.state.value);
  };

  render() {
    return (
      <div>
        <div>{this.state.value}</div>
        <button onClick={this.asyncClick}>Async click</button>
        <button onClick={this.syncClick}>Sync click</button>
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

<div id="root"></div>
Run Code Online (Sandbox Code Playgroud)

  • 这很好解释 (2认同)
  • 更准确地说,“并非始终”取决于“ setState”是在组件生命周期内还是在外部调用。此处有更多详细信息,/sf/answers/3402768141/ (2认同)