setState
обычно не используется с обещаниями, потому что такая необходимость встречается редко.Если метод, вызываемый после обновления состояния (fetchRooms
), полагается на обновленное состояние (roomId
), он может получить к нему доступ другим способом, например, в качестве параметра.
setState
использует обратные вызовы и не используетне верни обещание.Поскольку это требуется редко, создание неиспользуемого обещания может привести к дополнительным расходам.
Чтобы вернуть обещание, можно обещать setState
, как это предлагается в в этом ответе .
Прикрепленный код работает с await
, потому что это хак.await ...
является синтаксическим сахаром для Promise.resolve(...).then(...)
.await
производит задержку в один тик, что позволяет оценивать следующую строку после завершения обновления состояния, что позволяет оценивать код в заданном порядке.Это то же самое, что:
this.setState({ roomId: room && room.roomId ? room.roomId : 0 } => {
console.log(2)
})
setTimeout(() => {
console.log(3)
});
Нет гарантии, что заказ останется таким же при других условиях.Кроме того, первый setState
обратный вызов не является подходящим местом для проверки, было ли обновлено состояние, для этого и нужен второй обратный вызов.