为什么要使用redux-thunk或redux-saga来获取?

时间:2016-12-11 21:46:18

标签: reactjs redux react-redux redux-thunk redux-saga

我一直在读,我应该使用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)。所以我想一定有一些我不知道的不便。

2 个答案:

答案 0 :(得分:4)

你的代码类似于thunk。

根据redux文档,操作应该是纯粹的。并且它们应始终为相同的输入参数返回相同的值。通过使用fetch,您允许操作返回非特定值,而不是来自服务器的值,这意味着操作响应可能会随时间而变化。

这称为副作用。而且它是默认情况下不应该在redux操作中出现的东西。

但为什么?

是的,您可以在内部操作中输入内容,在小型应用中无关紧要。

在较大的应用程序中,使用redux-saga

会带来好处
  • 动作是可预测的,它们只返回有效载荷,如

    {
      type: 'FETCH_POSTS',
      params: {
        category: 'programming'
      }
    }
    
  • 然后构建中间件,该中间件将对执行实际API请求所需的所有数据执行操作

可能的优势:

  • 清洁代码库(但可能是较小应用程序的开销)
  • 分离&#34;假&#34;具有执行请求和实际API中间件所需的所有信息的操作
  • 请求参数直接在redux dev工具中可见
  • 使用redux-thunk可能很容易debouncethrottle抓取可能非常棘手
  • 可以轻松组合操作(等待其他事件/获取,链事件)
  • 可能停止运行任务

从个人经验来看,在一个项目(更大的代码库)上我们已经开始使用redux-thunk,但后来我们需要集成更多高级功能,例如限制,以及操作之间的一些依赖关系。因此,我们将所有内容重写为redux-saga,并且对我们来说效果很好。

答案 1 :(得分:1)

你在这里复制redux-thunk。纯redux动作创建者应该返回要调度的动作对象,而不是自己发送动作(参见redux doc on action creator)。

为了更好地理解为什么你的技术是redux-thunk的复制,请查看其作者的this post