首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么没有在subscribe块中调用store.dispatch()?

在Redux中,subscribe方法用于订阅store中的状态变化。当调用store.dispatch()方法触发一个action后,Redux会根据reducer的逻辑进行状态的更新,并通知所有已经订阅的函数。因此,为什么没有在subscribe块中调用store.dispatch()是因为在subscribe的回调函数中调用store.dispatch()可能导致无限循环。

当我们在subscribe中调用store.dispatch()时,会触发一个action,并引发reducer的执行。然而,reducer执行完成后,由于状态更新,subscribe中的回调函数将再次被调用。如果在回调函数中再次调用store.dispatch(),则会再次触发action,再次引发reducer执行,如此往复,导致无限循环。

这是因为在subscribe方法中执行store.dispatch(),会将dispatch的action加入到当前执行的action队列中。由于subscribe的回调函数是在当前的action执行完毕后才执行的,因此又会触发新的action,再次执行subscribe中的回调函数。这种情况下,循环会一直进行下去,直到栈溢出或其他错误发生。

为了避免这种无限循环的问题,Redux禁止在reducer中直接调用store.dispatch()。在实际开发中,我们应该将store.dispatch()放在组件的逻辑中,例如在用户交互事件处理函数中触发dispatch,或在生命周期钩子函数中调用。这样可以保证单向数据流的正常进行,避免不必要的循环。

总结: 在subscribe块中不应该调用store.dispatch(),因为这样可能导致无限循环的问题。Redux禁止在reducer中直接调用store.dispatch(),应该将store.dispatch()放在组件逻辑中,例如用户交互事件处理函数或生命周期钩子函数中调用。这样可以保证单向数据流的正常进行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么wait和notify方法要在同步调用

,那么这是为什么呢?...为什么wait和notify方法要在同步调用? 我们先来发出一个灵魂拷问:什么时候才需要wait? 什么时候又需要notify?...lock.wait()堵塞,然后有元素添加到队列的时候再采用lock.notify()唤醒,这段代码可能会导致如下问题: 一个消费者调用take,发现buffer.isEmpty 消费者调用wait之前...所以:wait和notify方法要在同步调用的根本原因是,这两个方法存在竞态条件。如果不加锁的话,那么wait被调用的时候可能wait的条件已经不满足了(如上述)。...由于错误的条件下进行了wait,那么就有可能永远不会被notify到,所以我们需要强制wait/notifysynchronized

99920

java 为什么wait(),notify(),notifyAll()必须在同步方法代码调用

这一点通常不会被程序员注意,因为程序验证通常是在对象的同步方法或同步代码调用它们的。...这意味着调用某对象的wait()方法之前,当前线程必须已经获得该对象的锁。因此,线程必须在某个对象的同步方法或同步代码才能调用该对象的wait()方法。...如果没有线程该对象的等待队列中等待获得锁,那么notify()和notifyAll()将不起任何作用。调用对象的notify()和notifyAll()方法之前,调用线程必须已经得到该对象的锁。...的代码,没有对象锁是寸步难行的。....同步方法和同步,无论sleep()还是suspend()都不可能自己被调用的时候解除锁定,他们都霸占着正在使用的对象锁不放.

1.8K10
  • .NET动态调用Nodejs代码实现低代码平台代码节点

    低代码平台中,通常有业务逻辑编排的能力,在业务逻辑编排中有很多不同类型的节点,例如:逻辑判断、接口调用、数据更新等,但为了方便开发人员使用,如果添加代码的节点,将会极大增加开发效率。...代码节点可以使用 Node.js、Python 等解释型语言来处理逻辑,《dotNet 5 执行 Node.js》一文,介绍了 .NET 通过 NodeServices 包来动态执行 Node.js...1、 Rider 创建一个 .NET 8 的 Web API 项目。...CodeBlockInfo { public string Code { get; set; } } 定义一个 CodeBlockInfo 实体用来传输需要执行的 js 代码 接口 run 调用...2、 publish 目录添加 Dockerfile 文件,内容如下: FROM mcr.microsoft.com/dotnet/aspnet:8.0 COPY .

    19610

    【DB笔试面试565】Oracle为什么索引没有被使用?

    ♣ 题目部分 Oracle为什么索引没有被使用? ♣ 答案部分 “为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。...还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)“文档1549181.1为何在查询索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOG(...二、索引本身的问题 n 索引的索引列是否WHERE条件(Predicate List)? n 索引列是否用在连接谓词(Join Predicates)?...n 总体成本,表扫描的成本是否占大部分? n 访问空索引并不意味着比访问有值的索引高效? n 参数设置是否正确? 四、其它问题 n 是否存在远程表(Remote Table)?...n 是否WHERE子句中对索引列进行了IS NULL值判断? n 是否查询转换失败导致不能选择索引? n 是否使用了视图或子查询? ? 详细情况如下表所示: ?

    1.2K20

    React进阶(4)-拆分Redux-将store,Reducer,action,actionTypes独立管理

    改变store的数据唯一办法就是派发action,调用store.dispatch方法,也知道通过getState方法获取store的所有状态数据,而实现组件页面的更新与store保持同步,必须得触发注册...subscribe方法,通时还得监听一个事件处理函数 用于重新一次获取store的数据使页面同步更新 在上几次编写Redux的代码,创建store,reducer,acton,以及actionTypes...引入createStore后,store并没有创建,需要调用createStore()后才有store //const store = createStore(reducer, window....的type类型值定义成一个常量然后拆分了出去的,但是仍然发现,代码并没有简化多少 其实在派发action之前,改变store的数据,对于action的动作(具体要做的事情),是不应该直接定义我们的组件里...,事件处理函数里面定义action对象不是不可以 但是这样代码的内聚性不高,对于简易的项目,一些action定义各个组件内,也没有什么,但是一多的话,找起来就是灾难了的,不利于后续代码的维护 如果你能够把相应的

    1.9K11

    React进阶(4)-拆分Redux-将store,Reducer,action,actionTypes独立管理

    改变store的数据唯一办法就是派发action,调用store.dispatch方法,也知道通过getState方法获取store的所有状态数据,而实现组件页面的更新与store保持同步,必须得触发注册...subscribe方法,通时还得监听一个事件处理函数 用于重新一次获取store的数据使页面同步更新 在上几次编写Redux的代码,创建store,reducer,acton,以及actionTypes...引入createStore后,store并没有创建,需要调用createStore()后才有store //const store = createStore(reducer, window....生命周期函数内调用操作也是可以的 } // componentWillMount(){ // store.subscribe(this.handleStoreChange);...的type类型值定义成一个常量然后拆分了出去的,但是仍然发现,代码并没有简化多少 其实在派发action之前,改变store的数据,对于action的动作(具体要做的事情),是不应该直接定义我们的组件里

    1.7K10

    Redux源码解读

    (createStore/dispatch())的体现: try { isDispatching = true // 重新计算state // (state, action) => state...dispatcher的概念,每个action过来,都从顶层reducer开始流经整个reducer树,每个reducer只关注自己感兴趣的action,制造一小state,state树与reducer...:f1-f2-f3 即从左向右 applyMiddleware部分有用到这种顺序,参数求值过程bind next(从右向左),函数调用过程next()尾触发(从左向右)。...preloadedState, enhancer) { // 计算第一个state dispatch({ type: ActionTypes.INIT }) } 明明可以直接点,比如store.init(),为什么自己还非得走...剥掉fn2 利用reduceLeft参数求值过程bind next 再看调用过程: 调用被篡改过的disoatch时,从左向右传递action action先按next链顺序流经所有middleware

    49040
    领券