こんにちは。
目下、 react とreduxを使ったSPA開発に従事していますが、非同期処理に
redux-saga を採用して便利に使っています。
ご質問の回答ですが、
何かIO系の時間のかかる処理を画面の一部で行うので、その準備ができるまでは他の処理をする
という認識でほぼ正しいと言えますが、言い換えると
何か時間のかかる(≒ 完了するまでの時間が不明な)処理をしている間、
UI(画面)を通じて、ユーザーに何かを知らせたり、
ユーザーからの入力が受けつけられなくなると不便なので、
その時間のかかる処理を(Promiseなどを使って、)非同期にやらせる。
という理解でよろしいかと思います。
典型的にこういう処理は普通非同期処理として
扱うものの一例としては、API の呼び出しです。
redux-saga の README にサンプルとして載っている sagas.js の冒頭:
javascript
1import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
2import Api from '...'
3
4// worker Saga: will be fired on USER_FETCH_REQUESTED actions
5function* fetchUser(action) {
6 try {
7 const user = yield call(Api.fetchUser, action.payload.userId);
8 yield put({type: "USER_FETCH_SUCCEEDED", user: user});
9 } catch (e) {
10 yield put({type: "USER_FETCH_FAILED", message: e.message});
11 }
12
の、上記2行目にも
javascript
1import Api from '...'
とあり、call
で呼び出している Api.fetchUser
は、(ざっくり書くと、)
以下のようなものが import
されていると想定されます。
javascript
1const fetchUser = (userId) => {
2 return fetch(`http://example.com/users/${userId}`)
3 .then(response => response.json());
4};
5
あるAPIをリクエストしてから、そのレスポンスが返るまでというのも、一般的には時間のかかる処理ですから、
何かIO系の時間のかかる処理
の一例になっています。
loading...などと表示する
についてですが、APIをリクエストして、その結果が返ってくるまでの間にローディングアイコンを表示させる、というのはよくあるUIですね。先のsagas.js の例でこれをやろうとすれば、
- redux state にAPIリクエスト中を示すフラグを持っておく。
- ユーザー情報取得をリクエストするというアクション(
USER_FETCH_REQUESTED
)が発行されたときに、このフラグを true
にする。
- APIが成功(
USER_FETCH_SUCCEEDED
)した、あるいは失敗(USER_FETCH_FAILED
)したときに、このフラグをfalse
にする。
- 上記のようにリデューサを実装して、APIのリクエスト中フラグをpropsで受け取りたいReactコンポーネントをReduxに connectする。
- このフラグが true のときは、このコンポーネント内のどこかに
loading...などと表示する
ように render させる。
というように作ることになると思います。
以上参考になれば幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/07/12 07:15
2018/07/13 01:10 編集
退会済みユーザー
2018/07/13 02:12