長いテキストで申し訳ありません...初期状態を計算するために互いに待機する必要があるいくつかのアクションをチェーンする最良の方法を見つけようとしています。おそらく再選択が役立つでしょうが、それをどのように適合させるかを理解するのに苦労しています.ImmutableJSを使用していますが、標準のJSONを使用して問題を説明します. 初期状態は次のようになります。
{
"book": {
"id": 1,
"title": "THE book",
"notes": [
1,
2,
4
]
},
"detailedNotes": [
{
"id": 1,
"text": "Just a note",
"categories": [
"Vital"
]
},
{
"id": 2,
"text": "Testing",
"categories": [
"Vital"
]
},
{
"id": 4,
"text": "Doodling",
"categories": [
"Relevant"
]
}
],
"notesByCategory": [
{
"Vital": [
1,
2
]
},
{
"Relevant": [
4
]
}
],
"activeCategory": "Vital"
}
bookとdetailedNotesは GET 呼び出し (フェッチを使用) からのものです。notesByCategoryは私のコードによって計算されます (現時点ではレデューサーで...)。 また、activeCategoryの初期値を最初に計算されたカテゴリ (例ではVital ) として設定する必要があります。actions.js と reducer.js に関連するコードは次のとおりです。
//in actions
export function fetchBook(id) {
return function (dispatch) {
return fetch('/api/book/' + id)
.then(json => {
dispatch(receiveBook(json));
dispatch(fetchDetailedNotes(json['notes']));
}
);
}
}
export function fetchDetailedNotes(ids) {
return function (dispatch) {
return fetch('/api/notes/?ids=' + ids.join())
.then(json => dispatch(receiveDetailedNotes(json)))
}
}
export function receiveDetailedNotes(detailedNotes) {
return {
type: RECEIVE_DETAILED_Notes,
detailedNotes
}
}
//in reducer
function detailedNotesReducer(state = List(), action) {
switch (action.type) {
case actions.RECEIVE_DETAILED_NOTES:
return fromJS(action.detailedNotes);
default:
return state
}
}
function notesByCategory(state = List(), action) {
switch (action.type) {
case actions.RECEIVE_DETAILED_NOTES:
return extractNotesByCategory(state, action.detailedNotes);
default:
return state
}
}
レデューサー構成もありますが、割愛しました。ここで、最初のactiveCategoryを最初のカテゴリに設定したいのですが、問題があります。これをどこに置くべきかわかりません。状態のnotesByCategory部分が計算されるまで、最初に待機する必要があります。この計算はレデューサーに入れるべきではないと思います。助言がありますか?