side effect 是指 ajax call 或是 persist 到 local storage 之類的。 ajax code 是放在 action,persist 大概放 store 吧 ? 。
剩下可以 pure 處理的才可放在 reducer (大概是 model 之類的吧?)
不知有沒理解錯
Redux 在文件 Async Actions1 中有說到,這時候通常用 redux trunk middleware 寫一種叫 Action Creator 的東西。儲存理應放在 Store 。
不喜歡 Redux 的地方就是這種造一大堆新的 abstraction 出來,而且也不是唯一的做法,新手不知道對不對。
天啊!! 這東西好複雜,看了好久才知道他在說什麼。
一般來說store.dispatch應該只吃Action1 type,但是透過middleware可以包裝此dispatch變成可以吃Thunk這個型態,此型態的定義在 這裡2 ,簡單講就是一個
function(dispatch, getState)
這種型態的function。透過closure的方式,可以讓在async的地方去call這兩個redux會用到的function,來達到ajax complete的時候,去sync的呼叫dispatch來通知complete。
這個可能對於用redux的人可能會知其然但不知所以然吧,如果沒有搞懂thunk的機制,可能覺得莫名其妙吧。我同意你說的,這些abstraction不太必要,只是讓一且覺得很神奇而已,對於新手入門門檻太高了。
side effect就是改變外面的狀態就是side effect,例如counter++就是side effect。所以以下的increase function就是有side-effect
var myObject = {
counter: 0,
increase: function() {
this.counter++;
}
}
因為他改變了counter的值了。而no side-effect的版本是
function addOne(counter) {
return counter + 1;
}
而redux做的事情是state = reducer(state);
所以這個assignment是做redux裡面,而非reducer。
事實上在functional language中,assignment is evil XD。所以他們才那麼不同意Imperative programming style。