首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Redux Saga异步调用两次

Redux Saga异步调用两次
EN

Stack Overflow用户
提问于 2021-03-18 17:32:58
回答 1查看 62关注 0票数 0

我正在用redux saga构建react-native应用程序。我想我做错了什么。这可能是因为我不太了解saga是如何工作的。但我想知道的是为什么你要打两次电话。

我的第一个呼叫按钮。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    <Button
                loading={pending}
                onPress={this.handleLogin}
                containerStyle={styles.margin}
              />

我的按钮函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 handleLogin = () => {
    const { screenProps: {t} } = this.props;
    const {email, password} = this.state;
    this.props.dispatch(signInWithEmail({email, password}));

我的行为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as Actions from './constants';

export function signInWithEmail({email, password}) {
  return {
    email,
    password,
    type: Actions.SIGN_IN_WITH_EMAIL,
  };
}

我的传奇听众

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default function* authSaga() {
  yield takeEvery(Actions.SIGN_IN_WITH_EMAIL, signInWithEmailSaga);
  yield takeEvery(Actions.SIGN_IN_WITH_MOBILE, signInWithMobileSaga);
  yield takeEvery(Actions.SIGN_UP_WITH_EMAIL, signUpWithEmailSaga);
  yield takeEvery(Actions.SIGN_IN_WITH_GOOGLE, signInWithGoogleSaga); 
  ...
}

我的saga函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function* signInWithEmailSaga({email, password}) {
  try {
    const language = yield select(languageSelector);
    let loginRequest = {
      email,
      password,
    };
    const token = globalConfig.getToken();
    const responseLogin = yield call(loginWithEmail, loginRequest);

    if (!responseLogin.user) {
      console.log('if not user', responseLogin);
      yield put({
        type: Actions.SIGN_IN_WITH_EMAIL_ERROR,
        payload: {
          message: responseLogin.message,
        },
      });
    } else {
      yield call(setUser, responseLogin);
    }
  } catch (e) {
    // yield call(handleError, e)
    yield put({
      type: Actions.SIGN_IN_WITH_EMAIL_ERROR,
      payload: {
        message: e.message,
      },
    });
  }
}

我向服务器发送电子邮件和密码以获取响应。我是通过yield call(loginWithEmail, loginRequest);制作的

如果signInWithEmailSaga函数仅包含控制台日志行,则仅触发两次。这对我来说是一个巨大的错误。我花了20个小时,但我没有。

我使用了takeLatest、takeEvery并更改了操作名称。同样的结果。

这是我的redux store和saga中间件设置。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import {composeWithDevTools} from 'redux-devtools-extension';
import {createStore, applyMiddleware, compose} from 'redux';
import createSagaMiddleware from 'redux-saga';
import {persistStore, persistReducer} from 'redux-persist';
import AsyncStorage from '@react-native-community/async-storage';
import immutableTransform from 'redux-persist-transform-immutable';
import rootReducer from './reducers';
import rootSaga from './sagas';

const persistConfig = {
  key: 'root',
  transforms: [immutableTransform()],
  storage: AsyncStorage,
  whitelist: [
    // 'test',
    'common',
    'category',
    'classified',
    //'auth',
  ],
};

const composeEnhancers =
  process.env.NODE_ENV === 'development'
    ? composeWithDevTools({realtime: true})
    : compose;
const sagaMiddleware = createSagaMiddleware();
const persistedReducer = persistReducer(persistConfig, rootReducer);

export default () => {
  const enhancer = composeEnhancers(applyMiddleware(sagaMiddleware));
  const store = createStore(persistedReducer, enhancer);
  let persistor = persistStore(store);
  // then run the saga
  sagaMiddleware.run(rootSaga);
  return {store, persistor};
};

如果您能提供问题所在的信息,我将非常高兴。谢谢。

EN

回答 1

Stack Overflow用户

发布于 2021-03-18 18:32:43

当您更改路由并返回同一页面时,可能会再次注册您的saga侦听器

解决方案将是,当对应于该特定路线的集装箱被卸载时,注销saga

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66696220

复制
相关文章
redux-saga
作为一个Redux中间件,想让Redux应用中的副作用(即依赖/影响外部环境的不纯的部分)处理起来更优雅
ayqy贾杰
2019/06/12
1.9K0
redux-saga
因此我们首先得学习Redux,中文官网地址:http://cn.redux.js.org/
阿超
2022/08/21
5520
redux-saga
Redux 异步解决方案2. Redux-Saga中间件
因为Generator。结合yield  yield操作符会获取右边表达示的值返回 可以用于异步变同步操作 中间件的特性: 以前的 action -> reducers -> store 现在的 action -> middleware -> reducers -> store
憧憬博客
2020/07/21
1.1K0
React-Redux-Saga
如上自定义函数已经获取到了网络数据,添加到 Redux 中保存是通过 Saga 提供的 put 方法进行添加即可,在更改 store.js 告诉 saga 中间件的生成器哪些通过 dispatch 派发的 action 需要进行拦截, 在 run 方法进行指定:
杨不易呀
2023/10/01
2180
React-Redux-Saga
redux-saga入门[通俗易懂]
使用 dispatch 往 store 发送 action 的这个过程是可以被拦截的, 自然而然地就可以在这里增加各种中间件Middleware。redux-saga是redux的中间件,主要负责从action派发到更新store中间具有副作用行为的处理。
全栈程序员站长
2022/11/04
1.4K0
redux-saga入门[通俗易懂]
redux-saga学习
如果redux需要用到 side effect 异步操作,redux-thunk 和 redux-saga 绝对是目前两个最受欢迎的中间件插件。
全栈程序员站长
2022/11/04
2.7K0
redux-saga学习
redux-saga_pub culture
项目链接: https://github.com/fanxiao168/React-todoList 什么是Redux Saga
全栈程序员站长
2022/11/04
1.4K0
手写Redux-Saga源码
上一篇文章我们分析了Redux-Thunk的源码,可以看到他的代码非常简单,只是让dispatch可以处理函数类型的action,其作者也承认对于复杂场景,Redux-Thunk并不适用,还推荐了Redux-Saga来处理复杂副作用。本文要讲的就是Redux-Saga,这个也是我在实际工作中使用最多的Redux异步解决方案。Redux-Saga比Redux-Thunk复杂得多,而且他整个异步流程都使用Generator来处理,Generator也是我们这篇文章的前置知识,如果你对Generator还不熟悉,可以看看这篇文章。
蒋鹏飞
2020/10/29
1.7K0
手写Redux-Saga源码
Redux:从action到saga
该文章讲述了如何使用 Redux 和 Redux Saga 管理应用程序的状态和行为。通过使用 Redux,可以轻松地将状态存储在全局变量中,并在组件之间轻松共享数据。Redux Saga 是一种异步处理程序,可以处理异步操作,例如网络请求,从而提高应用程序的性能。
查理大叔
2017/12/24
1.2K0
React-Redux-Saga实现原理
React-Redux-Saga是一个用于处理Redux异步操作的中间件,它的实现原理基于生成器函数(Generator Functions)和事件监听模式。
杨不易呀
2023/10/01
3100
React-Redux-Saga实现原理
一文梭穿Vuex、Flux、Redux、Redux-saga、Dva、MobX
不管是Vue,还是 React,都需要管理状态(state),比如组件之间都有共享状态的需要。什么是共享状态?比如一个组件需要使用另一个组件的状态,或者一个组件需要改变另一个组件的状态,都是共享状态。
viktor
2022/09/19
5.5K0
一文梭穿Vuex、Flux、Redux、Redux-saga、Dva、MobX
高级前端react面试题总结
(1)不要在循环,条件或嵌套函数中调用Hook,必须始终在 React函数的顶层使用Hook
beifeng1996
2022/12/15
4.1K0
React之redux学习日志(redux/react-redux/redux-saga)
redux官方中文文档:https://www.redux.org.cn/docs/introduction/CoreConcepts.html
全栈程序员站长
2021/04/07
5580
React之redux学习日志(redux/react-redux/redux-saga)
深入理解 redux 数据流和异步过程管理
前端框架实现了数据驱动视图变化的功能,我们用 template 或者 jsx 描述好了数据和视图的绑定关系,然后就只需要关心数据的管理了。
神说要有光zxg
2021/09/28
2.5K0
关于redux-saga中take使用方法
带来一个自己研究好久的API使用方法. redux-saga中effect中take这个API使用方式,用的多的是call,put,select,但take这个平常还真没什么机会用上,也不清楚在哪里使用才好,不管怎么样,既然是redux-saga写出来的,肯定是有他的用法的,不管37 21,先学会使用方法再说. 先看看介绍: take   take的表现同takeEvery一样,都是监听某个action,但与takeEvery不同的是,他不是每次action触发的时候都相应,而只是在执行顺序执行到take语
杭州前端工程师
2018/06/15
1.9K0
React saga_react获取子组件ref
React的作用View层次的前端框架,自然少不了很多中间件(Redux Middleware)做数据处理, 而redux-saga就是其中之一,目前这个中间件在网上的资料还是比较少,估计应用的不是很广泛,但是如果使用得当,将会事半功倍的效果,下面仔细介绍一个这个中间件的具体使用流程和应用场景。
全栈程序员站长
2022/09/27
4.5K0
React saga_react获取子组件ref
前端实现异步的几种方式_redux是什么
实际上,这个术语出自康奈尔大学的一篇论文:http://www.cs.cornell.edu/andru/cs711/2002fa/reading/sagas.pdf
全栈程序员站长
2022/10/02
1.7K0
前端实现异步的几种方式_redux是什么
高频React面试题及详解
以下面试题来源于github项目前端面试指南,那里有超过200道高频前端面试题及答案,目前拥有1400star.
前端小tips
2021/11/30
2.5K0
高频React面试题及详解
百度前端高频react面试题(持续更新中)_2023-02-27
2. 尽量不要在 componentWillReviceProps 里使用 setState,如果一定要使用,那么需要判断结束条件,不然会出现无限重渲染,导致页面崩溃
用户10358021
2023/02/27
2.3K0
使用dva脚手架中使用redux-sage感受
最近在使用了redux进行项目的开发,这个东西确实是把逻辑和页面的展示区分开了,在代码的书写上,以及以后的更改代码,提供了更多的方便. dva对redux-saga封装了一层,目前我使用的情况来看还是比较方便的,可以把所有的项目运算都放到一个文件中. 在使用redux-saga进行项目管理里,建议,使用者前,能够充分了解state的不足之处,我能理解react中state的不足之处便是:在项目足够大的时候,每个组件之间的相互调用参数,传递参数,给我带来了很多的不便,比如一个下拉select的数据,在A组件中
杭州前端工程师
2018/06/15
1.2K0

相似问题

Redux-Saga:异步任务被调用两次

10

redux-saga:函数调用两次

11

Redux Saga中的依赖异步调用

13

带有redux-saga的异步api调用

211

Redux Saga异步/等待模式

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文