【发布时间】:2018-04-11 15:58:43
【问题描述】:
我一直在我的 ReactJS 项目中使用带有 babel 的 async await。我发现了一个方便的 React setState 用法,我想更好地理解它。考虑这段代码:
handleChange = (e) => {
this.setState({[e.target.name]: e.target.value})
console.log('synchronous code')
}
changeAndValidate = async (e) => {
await this.handleChange(e)
console.log('asynchronous validation code')
}
componentDidUpdate() {
console.log('updated component')
}
我的目的是让异步验证代码在组件更新后运行。它有效!结果控制台日志显示:
synchronous code
updated component
asynchronous validation code
只有在 handleChange 更新了状态并渲染了新的状态后,验证代码才会运行。
通常要在状态更新后运行代码,您必须在 this.setState 之后使用回调。这意味着如果你想在 handleChange 之后运行任何东西,你必须给它一个回调参数,然后将其传递给 setState。不漂亮。但是在代码示例中,不知何故,await 知道在状态更新后 handleChange 已完成……但我认为 await 仅适用于 Promise,并等待 Promise 解决后再继续。 handleChange 中没有承诺也没有解决方案...它怎么知道要等待什么?
这意味着 setState 似乎是异步运行的,并且 await 以某种方式知道它何时完成。也许 setState 在内部使用了 Promise?
版本:
反应:“^15.4.2”
babel-core: "^6.26.0"
babel-preset-env: "^1.6.0",
babel-preset-react: "^6.24.1",
babel-preset-stage-0: "^6.24.1"
babel-plugin-system-import-transformer: "^3.1.0",
babel-plugin-transform-decorators-legacy: "^1.3.4",
babel-plugin-transform-runtime: "^6.23.0"
【问题讨论】:
-
上面的代码在
undefined上有一个await(因为handleChange不返回任何内容)。你确定它对setState有影响吗? -
你用的是什么版本的 React 和 babel?
-
这很奇怪,但我确认 await 有效果。
await this.setState({ data: true }, () => console.log('callback')); console.log('inline');明确表示callback将首先被解雇,但是 - 删除 await 并像通常 setState 一样工作 - 先是inline然后是callback -
@DavinTryon 似乎是正确的,你应该把它变成一个答案,这对未来的其他人会有帮助,而且这是一个很常见的搜索
-
我也想详细说明一下。 setState 返回的 undefined 是异步的吗?组件更新后总是返回吗?
标签: reactjs async-await babeljs