1) Я пытаюсь лучше понять async await
.У меня было представление, что установка setState
в функции await .then(//setState)
позаботится об асинхронной природе setState
, но это не так после выполнения некоторых тестов.
constructor(){
this.state = { msg: 'ZERO' }
}
async componentDidMount() {
await this.setter();
this.setState({ msg: 'TWO' });
console.log('AFTER', this.state.msg) //Logs TWO
}
setter = () => {
this.setState({ msg: 'ONE' }, () => console.log('INSIDE', this.state.msg)); //Logs ONE
console.log('BOTTOM', this.state.msg) //Logs ZERO
return Promise.resolve();
}
Журнал в setter()
BOTTOM
показывает ZERO
, и это демонстрирует асинхронную природу setState
.Даже если перед журналом устанавливается состояние ONE
, в нем отображается значение по умолчанию ZERO
.Часть, которую я не понимаю, - когда Обещание возвращается и setState
повторяется после await this.setter()
, журнал AFTER
покажет TWO
.Если это не ONE
, так как setState
в setter
было от await
, то после setState
after не переносится в обещание или ожидание, но в журнале AFTER
все еще отображается правильное значение.Почему ??
2) Мой другой вопрос, касающийся асинхронного ожидания, - это возвращение обещаний.Когда я не вернусь Promise.resolve()
, появится сообщение об ошибке uncaught promise, cannot read property of then
.Тем не менее, у меня есть функция onSubmit
, которая применяет ожидание к переданной функции проп, которая не возвращает Promise.resolve()
, но ошибка не отображается.
// COMPONENT A
onSubmit = async () => {
await this.props.passedInFunction(1);
}
// КОМПОНЕНТ B
passedInFunction = (num) => this.setState({value: num});
Как видите, passedInFunction
из COMPONENT B
не возвращает Promise.resolve
, но по какой-то причине в моем приложении, когда функция вызывается в COMPONENT A
эта «необъяснимая ошибка обещания не отображается».
РЕДАКТИРОВАТЬ: Забыли добавить await
перед passedInFunction