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

Redux-saga yield在catch块中的put()未执行

Redux-saga是一个用于管理应用程序副作用(例如异步请求和数据获取)的库。它基于Generator函数和yield关键字来实现异步流程的控制。

在Redux-saga中,可以使用try-catch语句来捕获和处理异步操作中的错误。当在catch块中调用put()函数时,put()函数用于触发一个Redux action,以便在Redux store中更新相应的状态。

然而,如果在catch块中调用的put()函数未执行,可能有以下几个原因:

  1. 异步操作中的错误没有被正确捕获:确保在saga函数中正确使用try-catch语句来捕获异步操作中的错误。如果错误没有被捕获,catch块中的代码将不会执行。
  2. put()函数未被正确调用:确保在catch块中正确调用put()函数,并传递正确的action对象作为参数。检查是否有任何拼写错误或语法错误导致put()函数未被执行。
  3. 异步操作中的错误被其他错误处理机制捕获:在Redux-saga中,还可以使用其他错误处理机制,如takeEvery()和takeLatest()等。如果在这些机制中已经处理了错误,那么catch块中的put()函数可能不会执行。

总结起来,确保在Redux-saga中正确捕获异步操作中的错误,并在catch块中正确调用put()函数,可以确保在错误发生时正确触发相应的Redux action。如果问题仍然存在,可以进一步检查代码逻辑和错误处理机制是否正确。

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

相关·内容

redux-saga入门

sagayield 后面的内容我们称呼它为Effect(redux-saga任务单元),Effects我们可以进行启动其它saga,也可以处理一些副作用操作。...Effects是一些简单对象,如下put({ type: ‘increment’ }),我们使用redux-saga提供put方法创建一个Effect对象。...如果直接打印Effect: console.log(put({ type: 'increment' })); redux-saga 世界里,Saga 都用 Generator 函数实现...一个task就想一个在后台运行进程,redux-saga应用程序,可以运行多个task,task可通过fork函数创建。...如果参数某个任务失败且该任务对错误进行处理,那么错误将冒泡到all所在Generator,且取消其他任务。 如果错误被catch处理,那么依然视为完成。不会取消其它任务。

1.2K20

redux-saga

API形式提供,提供各种语义用来生成Effect工具函数,例如把dispatch action包装成put、把方法调用包装成call/apply Effect -> 业务操作 执行时内部进行转换...所以添一层描述对象来解决这个问题,测试case可以简单比较描述对象,实际起作用Promise由redux-saga内部生成 这样做好处是单测不用mock异步方法(一般单测中会把所有异步方法替换掉...所以如果任一task有捕获error,当前saga也会结束 另外,cancel机制比较有意思: 对于执行task序列,所有task自然完成时,把结果向上传递到队首,作为上层某个yield返回值...({ type: 'PRODUCTS_RECEIVED', products }) } catch(error) { yield put({ type: 'PRODUCTS_REQUEST_FAILED...这样保证了LOGOUT总是执行过LOGIN之后某个时刻发生,代码看起来相当漂亮 特定操作提示 // 创建第3条todo时候,给出提示消息 function* watchFirstThreeTodosCreation

1.9K41

React-Redux-Saga

Redux-saga 简介redux-saga 和 redux-thunk 一样, 是一个 Redux 获取存储异步数据中间件redux-saga 可以直接拦截 dispatch 派发 action..., 从而实现在执行 reducer 之前执行一些其它操作使用 Redux-saga安装 Redux-saganpm install redux-saga创建 store 时应用 redux-saga...Saga 提供 put 方法进行添加即可,更改 store.js 告诉 saga 中间件生成器哪些通过 dispatch 派发 action 需要进行拦截, run 方法进行指定:图片在组件中派发...takeEvery 和 takeLatest 区别区别主要在于是否能够完整执行监听方法:对于 takeEvery 而言,每次拦截到对应类型 action, 都会完整执行监听方法对于 takeLatest...(博主所说是:如果派发下一次同类型 action 时候,上一次派发 action 还没有处理完, 也就是上一次监听方法还没有处理完)如果我们只需要保存一个数据, 那么直接通过 yield put

17430

redux-sage笔记

也一直听说redux-saga是个和redux-thunk能够实现类似功能库,而且redux-saga处理方法更加高压和方便。这几天阅读了下文档写些小结。...action分发时候就执行fetchProducts函数,在这里fetchProducts函数也是Generator函数(tips:注意yield* 就是Generator内执行另一个Generator...注意是,如果call调用fetch,默认fetch状态下返回是Promise实例,但是由于是call调用,返回是文本信息,可以直接调用 - put - put({type: '...) yield put({type: 'LOGIN_SUCCESS', token}) return token } catch(error) { yield put({type...相当于Promise.all 功能,所有的fun都结束了才会结束这个yield 被强行cancel会抛出SagaCancellationException(redux-sage下) 错误。

69830

前端实现异步几种方式_redux是什么

redux-saga就是一个帮你管理这堆saga管家,那么它跟其他中间件实现有什么不同呢?它使用了ES6Generator函数语法。...); yield put({type: "USER_FETCH_SUCCEEDED", user: user}); } catch (e) { yield put({type: "USER_FETCH_FAILED...但是这样的话不好做模拟(mock)测试:我们测试过程,一般不会真的执行异步任务,而是替换成一个假函数。实际上,我们只需要确保yield了一个正确函数,并且函数有着正确参数。...因此,相比于直接调用异步函数,我们可以仅仅 yield 一条描述函数调用指令,由redux-saga中间件负责解释执行该指令,并在获得结果响应时恢复Generator执行。...对象,比较常用是下面这几个: call:函数调用 select:获取Store数据 put:向Store发送action take:Store上等待指定action fork

1.7K30

Taro 小程序开发大型实战(七):尝鲜微信小程序云(下篇)

如果创建帖子成功,我们使用 redux-saga 提供 effects helpers 函数:putput 类似之前 view dispatch 操作,,来 dispatch 了三个 action...然后,跟着取数据是一个 try/catch 语句,用于捕获错误, try 语句,我们使用 db 查询操作:db.collection('user').doc(userId).get(),表示查询...如果获取帖子列表成功,我们使用 redux-saga 提供 effects helpers 函数:putput 类似之前 view dispatch 操作,,来 dispatch 了两个 action...接着就是 main 函数体,里面是一个 try/catch 语句,用于捕获错误, try 语句,我们使用 db 查询操作:db.collection('post').get(),表示查询所有的...接着就是 main 函数体,里面是一个 try/catch 语句,用于捕获错误, try 语句,我们首先从 event 对象里面获取到了 postId,接着我们使用 db 查询操作:db.collection

2.6K10

手写Redux-Saga源码

put({ type: "FETCH_USER_SUCCEEDED", payload: user }); } catch (e) { yield put({ type: "FETCH_USER_FAILED...整个Redux-Saga运行和原本Redux并不冲突,Redux甚至都不知道他存在,他们之间耦合很小,只需要时候通过put发出action来进行通讯。...并执行,如果遇到take就将它注册到channel上去,如果遇到put就将对应回调拿出来执行,但是Redux-Saga又将这个过程分为了好几层,我们一层一层来看吧。...runSaga对应源码看这里:github.com/redux-saga/… proc proc就是具体执行这个迭代器过程,Generator执行方式我们之前另一篇文章详细讲过,简单来说就是可以另外写一个方法...Redux-Saga增强了Reduxdispatch函数,dispatch同时会触发channel.put,也就是让Redux-Saga也响应回调。

1.7K30

Redux:从action到saga

这个时候就需要redux-saga了。redux-saga里saga就是一个可声明组织良好副作用实现方式(超时,API调用等等。。)...{ yield put({ type: 'FETCH_TODOS' }); const todos = yield call(fetch, '/todos'); yield put({ type...在上面的例子我用了两种副作用: 一个put副作用,它会给redux store分发一个action。 一个call副作用,它会执行一个异步方法(promise,cps后者其他saga)。...看代码: import { fork, take } from 'redux-saga'; function* loadTodos() { yield put({ type: 'FETCHING_TODOS...: take effect,它会等待分发redux action时候执行 fork effect, 它会触发另外一个effect,子effect开始之前就会执行 结语 给前端应用添加redux和redux-saga

1.2K00

react项目架构之路初探

Sagas 可以被看作是在后台运行进程,Sagas 监听发起action,然后决定基于这个 action来做什么 redux-saga 世界里,所有的任务都通用 yield Effects 来完成...(dispatch,getState),函数体内进行业务逻辑封装 redux-thunk缺点: action形式不统一 ,异步操作太分散,分散了各个action redux-saga本质是一个可以自执行...sagas 必须在store创建好之后 才能执行这句代码 store之前 执行 程序会报错 sagaMiddleware.run(rootSaga) const AppWithRouter = withRouter...写法 // 引入 redux-saga 引入effect import {call, put, take, fork, takeEvery, select} from 'redux-saga/effects...代码最后put 执行到reducer设置state中分页数据和每页返回数据 export function * init () { while (true) { const action

2.4K10

Taro 小程序开发大型实战(六):尝鲜微信小程序云(上篇)

}) } catch (err) { console.log('login ERR: ', err) // 登录失败,发起失败 action yield put({ type...接着,我们使用 redux-saga 提供 effects helpers 函数:putput 类似之前 view dispatch 操作,,来 dispatch 了三个 action:LOGIN_SUCCESS...SET_IS_OPENED:设置登录框开启/关闭信息 我们还从 redux-saga/effects 包中导入了必要函数: call: saga 函数调用其他异步/同步函数,获取结果 put:...登录逻辑是一个 try/catch 语句,用于捕捉可能存在请求错误, try 代码,我们使用了 Taro 为我们提供微信小程序云云函数 API Taro.cloud.callFunction...然后,跟着取数据是一个 try/catch 语句,用于捕获错误, try 语句,我们使用 db 查询操作:db.collection('user').where().get(),表示查询 where

2.2K20

React之redux学习日志(reduxreact-reduxredux-saga)

使用纯函数执行修改:reducer,应该返回一个纯函数,函数接受先前 state和action, 然后返回一个新 state 3....当我们需要执行一些异步操作时,由于action只能返回一个对象,从而需要借助一些中间件来达到目的,redux-thunk 和 redux-saga是常见两种中间件。   ...store 中新增 sagas.js 文件 import { call, put, takeEvery } from "redux-saga/effects" // 你可以写一个异步接口或者一个异步函数...const res = yield call(getUserInfoApi, action.userId) // 声明 effects 函数 put: 相当于 storedispatch...} export default testSaga   这样就完成了一个简单redux-saga配置和使用,componentdispatch getUserInfoAction这个action

53030

dva框架-快速了解

直接就会执行,一般用于数据初始化 reducers: 纯函数,如果有异步,必须借助effect effects:副作用(业务逻辑,包含同步和异步) 这里键名,就是actiontype...字段 payload: action传参数,都放在这里 call() : 表示调用异步函数 如果yield call是一个Promise对象,那只有Promise...返回是resolve方法情况下,下面跟着yield put及后面的代码才会执行,若返回了rejector则后面的代码则全部停止执行 put 表示 dispatch action,其他还有 select..., take, fork, cancel 等 注:yield put直接调用reducer,是堵塞,同步, 调用非reducer函数,是非堵塞,异步...,就是actiontype字段*/ *getData({payload},{call,put}){ const res = yield call(getTodolistDataApi

1.5K10

关于redux-sagatake使用方法

带来一个自己研究好久API使用方法. redux-sagaeffecttake这个API使用方式,用是call,put,select,但take这个平常还真没什么机会用上,也不清楚在哪里使用才好...先看看介绍: take   take表现同takeEvery一样,都是监听某个action,但与takeEvery不同是,他不是每次action触发时候都相应,而只是执行顺序执行到take语句时才会相应...而take则不一样,我们可以generator函数决定何时相应一个action,以及一个action被触发后做什么操作。...最大区别:take只有执行流达到时才会响应对应action,而takeEvery则一经注册,都会响应action。...则大有不同,函数会继续执行,就是下面的两个console会执行, 而takeEvery执行方法则放在它回调里了,看下面代码 yield takeEvery('takeBlur',()=>{console.log

1.8K50
领券