首页
学习
活动
专区
工具
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入门

saga中yield 后面的内容我们称呼它为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.4K20

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

    21430

    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下) 错误。

    72330

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

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

    2.7K10

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

    redux-saga就是一个帮你管理这堆saga的管家,那么它跟其他的中间件实现有什么不同呢?它使用了ES6中Generator函数语法。...); 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

    手写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增强了Redux的dispatch函数,在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.5K10

    JavaScript 中的函数式编程:纯函数与副作用

    缓存友好:由于纯函数对于相同的输入总是产生相同的输出,所以可以利用缓存来提高性能。副作用的概念与表现形式副作用则是指函数在执行过程中,除了返回值之外,还对外部环境产生了其他的影响。...如何管理副作用隔离副作用:将副作用集中在特定的模块或函数中,以便更好地控制和管理它们。采用函数式副作用处理库:例如 redux-saga 或 redux-thunk 用于处理异步操作等副作用。...} catch (error) { yield put(fetchDataFailure(error.toString())); }}function* watchFetchDataSaga()...redux-saga 中,副作用是通过 generator 函数管理的。...这些函数使用 yield 关键字来暂停和恢复执行。

    17100

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

    }) } catch (err) { console.log('login ERR: ', err) // 登录失败,发起失败的 action yield put({ type...接着,我们使用 redux-saga 提供的 effects helpers 函数:put,put 类似之前在 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.3K20

    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: 相当于 store中的dispatch...} export default testSaga   这样就完成了一个简单的redux-saga的配置和使用,在component中dispatch getUserInfoAction这个action

    55830

    dva框架-快速了解

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

    1.8K10
    领券