我一直在读,我应该使用redux-thunk或redux-saga来处理副作用。 为什么不简单地使用这样的动作创建者来发送多个动作:
class Key {
final int index;
final int lastEl;
Key(int index, int lastEl) {
this.index = index;
this.lastEl = lastEl;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Key key = (Key) o;
if (index != key.index) return false;
return lastEl == key.lastEl;
}
@Override
public int hashCode() {
int result = index;
result = 31 * result + lastEl;
return result;
}
}
public int lis(final List<Integer> a) {
return maxIncreasing(0, Integer.MIN_VALUE, a);
}
HashMap<Key, Integer> memo = new HashMap<>();
private int maxIncreasing(int index, int lastElt, final List<Integer> a) {
Key key = new Key(index ,lastElt);
if(memo.containsKey(key)) return memo.get(key);
// end?
if(index >= a.size()) return 0;
int weTake = Integer.MIN_VALUE;
// can we take it?
if(a.get(index) > lastElt) {
// take it or don't
weTake = maxIncreasing(index + 1, a.get(index), a) + 1;
}
int weDoNot = maxIncreasing(index + 1, lastElt, a);
int max = Math.max(weTake, weDoNot);
memo.put(key, max);
return max;
}
我试过了,它有效(complete code)。所以我想一定有一些我不知道的不便。
答案 0 :(得分:4)
你的代码类似于thunk。
根据redux
文档,操作应该是纯粹的。并且它们应始终为相同的输入参数返回相同的值。通过使用fetch
,您允许操作返回非特定值,而不是来自服务器的值,这意味着操作响应可能会随时间而变化。
这称为副作用。而且它是默认情况下不应该在redux操作中出现的东西。
但为什么?
是的,您可以在内部操作中输入内容,在小型应用中无关紧要。
在较大的应用程序中,使用redux-saga
:
动作是可预测的,它们只返回有效载荷,如
{
type: 'FETCH_POSTS',
params: {
category: 'programming'
}
}
然后构建中间件,该中间件将对执行实际API请求所需的所有数据执行操作
可能的优势:
debounce
,throttle
抓取可能非常棘手从个人经验来看,在一个项目(更大的代码库)上我们已经开始使用redux-thunk
,但后来我们需要集成更多高级功能,例如限制,以及操作之间的一些依赖关系。因此,我们将所有内容重写为redux-saga
,并且对我们来说效果很好。
答案 1 :(得分:1)
你在这里复制redux-thunk。纯redux动作创建者应该返回要调度的动作对象,而不是自己发送动作(参见redux doc on action creator)。
为了更好地理解为什么你的技术是redux-thunk的复制,请查看其作者的this post