I made my componentWillMount()
async. Now I can using await
with the setState
.
Here is the sample code:
componentWillMount = async() => {
const { fetchRooms } = this.props
await this.setState({ })
fetchRooms()
}
So question here is this.setState
returns promise because I can use await
with it?
Edit
When I put await then it runs in a sequence 1, 2, 3
And when I remove await then it runs 1, 3, 2
??
componentWillMount = async() => {
const { fetchRooms } = this.props
console.log(1)
await this.setState({ } => {
console.log(2)
})
console.log(3)
fetchRooms()
}
setState does not return a promise.
setState has a callback.
You can simple customize a Promise for setState
Or
Hope this help =D
It does not return a promise.
You can slap the
await
keyword in front of any expression. It has no effect if that expression doesn't evaluate to a promise.setState
accepts a callback.setState
is usually not used with promises because there's rarely such need. If the method that is called after state update (fetchRooms
) relies on updated state (roomId
), it could access it in another way, e.g. as a parameter.setState
uses callbacks and doesn't return a promise. Since this is rarely needed, creating a promise that is not used would result in overhead.In order to return a promise,
setState
can be promisified, as suggested in this answer.Posted code works with
await
because it's a hack.await ...
is syntactic sugar forPromise.resolve(...).then(...)
.await
produces one-tick delay that allows to evaluate next line after state update was completed, this allows to evaluate the code in intended order. This is same as:There's no guarantee that the order will stay same under different conditions. Also, first
setState
callback isn't a proper place to check whether a state was updated, this is what second callback is for.You can promisify
this.setState
so that you can use the React API as a promise. This is how I got it to work:Later, I call
this.setAsyncState
using the standard Promise API:Don't think
setState
is returning aPromise
but you can always do thisor you can make some utility function like this
and use it inside a React.Component like this: