data를 fetch 하는 동안 Spin을 돌리기 위해서, async function에서 await 앞뒤로 Spin을 켜고 끄는 state를 추가하려고 한다.
this.setState
는 return value가 없다.
console.log(this.setState({ spin: true })
는 undefined
가 나온다.
this.setState
를 await
하려면 아래와 같이 사용할 수 없다. (Promise를 return하지 않기 때문에)
// Not work
const fetchData = async () => {
await this.setState({ spin: true });
const data = await fetch(`https://some-api.com/posts`);
await this.setState({ spin: false });
}
new Promise
를 만들고 resolve를 setState의 callback에 넣어줘서 해결할 수 있다.
// Okay
const setStateSpin = (state) => {
return new Promise(resolve => {
this.setState(state, resolve)
})
}
const fetchData = async () => {
await this.setStateSpin({ spin: true });
const data = await fetch(`https://some-api.com/posts`);
await this.setStateSpin({ spin: false });
}
callback에 setTimeout으로 delay를 줄 수 있다.
// Okay
const setStateSpin = (state, delay) => {
return new Promise(resolve => {
this.setState(state, () => {
setTimeout(() => {
console.log('state is updated');
resolve();
}, delay)
})
})
}
const fetchData = async () => {
await this.setStateSpin({ spin: true }, 1000);
const data = await fetch(`https://some-api.com/posts`);
await this.setStateSpin({ spin: false }, 0);
}