MobX를 비동기화하는 방법은 async await을 사용하는 방법과 generator를 사용하는 방법이 있다.
1. async await
import { makeObservable, action, runInAction, observable } from "mobx";
import axios from "axios";
export default class Test {
info = "";
constructor() {
makeObservable(this, {
info: observable,
get: action,
});
}
get = async () => {
const data = await axios.get("/info");
runInAction(() => {
console.log(data);
this.info = data.data.name;
});
};
}
MobX는 Action 내부에서 promise 작업, 즉 비동기 작업을 할 경우 observable 값을 바꾸려면 다시 액션 함수를
만들어서 호출하거나, 외부의 액션 함수를 호출해야 가능하다.
하지만, runInAction을 사용하면, 함수 내부에서 observable 값을 바꿀 수 있게된다.
2. generator/yield + flow
제너레이터와 MobX의 flow 속성을 이용하는 방법도 있다.
import { makeObservable, action, runInAction, observable, flow } from "mobx";
import axios from "axios";
export default class Test {
info2 = "";
constructor() {
makeObservable(this, {
info2: observable,
get2: flow,
});
}
get2 = function* () {
try {
const data = yield axios.get("/info");
this.info2 = data.data.name;
} catch (error) {}
};
}
제너레이터 함수와 flow를 사용하면 runInAction을 사용하는 방식과는 다르게 부수적인 작업이 필요없어서
코드가 깔끔해지는 장점이 있다.
또한 만약에 비동기 작업을 멈추고 싶다면, get2.cancel() 함수를 호출하면 비동기 작업이 캔슬된다.
반응형
'React > 실험실' 카테고리의 다른 글
[React] Redux - toolkit 사용해보기 - todo (1) | 2022.07.23 |
---|---|
[React] 실시간 채팅 만들기 (2) | 2022.06.25 |
[React] Webpack - 심화 (3) | 2022.04.28 |
[React] Webpack - Plugin 사용 (0) | 2022.04.18 |
[React] Webpack (1) | 2022.04.12 |