this.setState 是否在react中返回Promise

IT技术 javascript reactjs promise async-await setstate
2021-02-25 03:33:58

我做了我的componentWillMount()异步。现在,我可以用awaitsetState

这是示例代码:

componentWillMount = async() => {
  const { fetchRooms } = this.props
  await this.setState({ })
  fetchRooms()
}

所以这里的问题是this.setState返回Promise,因为我可以使用await它?

编辑

当我放置 await 然后它按顺序运行1, 2, 3当我删除 await 然后它运行1, 3, 2??

  componentWillMount = async() => {
    const { fetchRooms } = this.props
    console.log(1)
    await this.setState({ } => {
      console.log(2)
    })
    console.log(3)
    fetchRooms()
  }
6个回答

您可以Promise,this.setState以便您可以使用 React API 作为Promise。这就是我让它工作的方式:

class LyricsGrid extends Component {

  setAsyncState = (newState) =>
    new Promise((resolve) => this.setState(newState, resolve));

后来,我this.setAsyncState使用标准的 Promise API 调用:

this.setAsyncState({ lyricsCorpus, matrix, count })
  .then(foo1)
  .then(foo2)
  .catch(err => console.error(err))
您不必绑定箭头函数方法,因此您甚至不需要手动编写构造函数。他们自动捕捉周围环境的 this。
2021-04-23 03:33:58
他们没有内部 this,所以它只使用外部 this
2021-05-03 03:33:58
警告:来自 useState() 和 useReducer() 钩子的状态更新不支持第二个回调参数。要在渲染后执行副作用,请在组件主体中使用 useEffect() 声明它。
2021-05-08 03:33:58

setState通常不与Promise一起使用,因为很少有这样的需要。如果在状态更新 ( fetchRooms)之后调用的方法依赖于更新的状态 ( roomId),它可以以另一种方式访问​​它,例如作为参数。

setState使用回调并且不返回Promise。由于很少需要这样做,创建一个不使用的Promise会导致开销。

为了返回一个promise,setState可以promisified,如this answer中所建议的

发布的代码可以使用,await因为它是一个 hack。await ...是 的语法糖Promise.resolve(...).then(...)await产生一个滴答延迟,允许在状态更新完成后评估下一行,这允许按预期顺序评估代码。这与:

this.setState({ roomId: room && room.roomId ? room.roomId : 0 }, () => {
  console.log(2)
})

setTimeout(() => {
  console.log(3)
});

无法保证订单在不同条件下会保持不变。此外,第一个setState回调不是检查状态是否更新的合适位置,这就是第二个回调的用途。

在我看来,对带有 setState 的 promise 的主要需求是主观的:.then 语法非常优雅且易于理解。(超过第二个可调用的更新后参数)
2021-04-23 03:33:58
@Xmanoux 看起来很整洁,但如果是无意的,一滴答延迟会干扰 React 生命周期。在 1 个刻度中可能会发生很多事情。更具体地说,可以卸载组件(这将在 OP 中发生,因为 componentWillMount 不应该是异步的)。一般而言,promise 控制流存在一个已知问题,因为promise 不可取消且不知道组件生命周期。如果在不需要的地方使用Promise,它只会变得更加突出。
2021-05-11 03:33:58

setState 不返回Promise。

setState 有一个回调。

this.setState({
    ...this.state,
    key: value,
}, () => {
    //finished
});
如果使用钩子,则 setState 没有回调。
2021-04-29 03:33:58
@HasanSefaOzalp 但你可以使用effect它。
2021-04-29 03:33:58
警告:来自 useState() 和 useReducer() 钩子的状态更新不支持第二个回调参数。要在渲染后执行副作用,请在组件主体中使用 useEffect() 声明它。
2021-05-07 03:33:58
@Danish 我的回答是关于基于分类的组件而不是钩子。
2021-05-11 03:33:58

不要认为setState是返回 aPromise但你总是可以做到这一点

 await new Promise( ( resolve ) => 
     this.setState( {
         data:null,
     }, resolve )
 )

或者你可以做一些这样的实用功能

const setStateAsync = ( obj, state ) => {
    return new Promise( ( resolve ) =>
        obj.setState( state , resolve )
    )
}

并在 React.Component 中使用它,如下所示:

await setStateAsync(this,{some:'any'})

它不返回Promise。

您可以将await关键字放在任何表达式之前。如果该表达式不计算为Promise,则无效。

setState 接受回调。

不,我可以看到变化。让我再次澄清你的问题。当我把它await放在前面this.setState时停止代码。我通过在之前和之后放置日志来检查它this.setState这就是我在这里提出问题的原因。
2021-05-11 03:33:58