React redux api 每 x 秒轮询一次

2024-07-04

我已经做到了这一点,但我正在寻求一种更“最佳实践的方法”。

它使用https://icanhazdadjoke https://icanhazdadjokeapi 显示一个随机笑话,每 x 秒更新一次。有更好的方法吗?

最终我想添加停止、启动、重置功能,但感觉这种方式可能不是最好的。

我可以使用任何中间件吗?

还原操作

// action types
import axios from 'axios';
export const FETCH_JOKE = 'FETCH_JOKE';
export const FETCH_JOKE_SUCCESS = 'FETCH_JOKE_SUCCESS';
export const FETCH_JOKE_FAILURE = 'FETCH_JOKE_FAILURE';


function fetchJoke() {
  return {
    type: FETCH_JOKE
  };
}

function fetchJokeSuccess(data) {
  return {
    type: FETCH_JOKE_SUCCESS,
    data
  };
}

function fetchJokeFail(error) {
  return {
    type: FETCH_JOKE_FAILURE,
    error
  };
}

export function fetchJokeCall(){
  return function(dispatch){
    dispatch(fetchJoke());
    return axios.get('https://icanhazdadjoke.com', { headers: { 'Accept': 'application/json' }})
    .then(function(result){
      dispatch(fetchJokeSuccess(result.data))
    })
    .catch(error => dispatch(fetchJokeFail(error)));
  }
}

Redux减速机

import {combineReducers} from 'redux';
import {FETCH_JOKE, FETCH_JOKE_SUCCESS, FETCH_JOKE_FAILURE} from '../actions';

const defaultStateList = {
  isFetching: false,
  items:[],
  error:{}
};

const joke = (state = defaultStateList, action) => {
  switch (action.type){
  case FETCH_JOKE:
    return {...state, isFetching:true};
  case FETCH_JOKE_SUCCESS:
    return {...state, isFetching:false, items:action.data};
  case FETCH_JOKE_FAILURE:
    return {...state, isFetching:false, error:action.data};
  default:
    return state;
  }
};

const rootReducer = combineReducers({
  joke
});

export default rootReducer;

笑话组件

import React, { Component } from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { fetchJokeCall } from '../actions';


class Joke extends Component {
  componentDidMount() {
    this.timer = setInterval(()=>  this.props.fetchJokeCall(), 1000);
  }
  componentWillUnmount() {
    clearInterval(this.timer)
    this.timer = null;
  }
  render() {
    return (
      <div>
        {this.props.joke.joke}
      </div>
    );
  }
}

Joke.propTypes = {
  fetchJokeCall: PropTypes.func,
  joke: PropTypes.array.isRequired
};

function mapStateToProps(state) {
  return {
    joke: state.joke.items,
    isfetching: state.joke.isFetching
  };
}

export default connect(mapStateToProps, { fetchJokeCall })(Joke);

Redux-Sagas 更好,我们也在我们的应用程序中使用它,这就是您如何使用 Redux-Sagas 进行轮询

只是为了给你一个想法,这就是你可以做到的,你还需要了解 Redux-Sagas 是如何工作的

Action

export const FETCH_JOKE = 'FETCH_JOKE';
export const FETCH_JOKE_SUCCESS = 'FETCH_JOKE_SUCCESS';
export const FETCH_JOKE_FAILURE = 'FETCH_JOKE_FAILURE';
export const START_POLLING = 'START_POLLING';
export const STOP_POLLING = 'STOP_POLLING';

function startPolling() {
      return {
        type: START_POLLING
      };
    }

function stopPolling() {
      return {
        type: STOP_POLLING
      };
    }

function fetchJoke() {
  return {
    type: FETCH_JOKE
  };
}

function fetchJokeSuccess(data) {
  return {
    type: FETCH_JOKE_SUCCESS,
    data
  };
}

function fetchJokeFail(error) {
  return {
    type: FETCH_JOKE_FAILURE,
    error
  };
}

Reducer

import {combineReducers} from 'redux';
import {FETCH_JOKE, FETCH_JOKE_SUCCESS, FETCH_JOKE_FAILURE, START_POLLING, STOP_POLLING } from '../actions';

const defaultStateList = {
  isFetching: false,
  items:[],
  error:{},
  isPolling: false,
};

const joke = (state = defaultStateList, action) => {
  switch (action.type){
  case FETCH_JOKE:
    return {...state, isFetching:true};
  case FETCH_JOKE_SUCCESS:
    return {...state, isFetching:false, items:action.data};
  case FETCH_JOKE_FAILURE:
    return {...state, isFetching:false, error:action.data};
  case START_POLLING:
    return {...state, isPolling: true};
  case STOP_POLLING:
    return {...state, isPolling: false};
  default:
    return state;
  }
};

const rootReducer = combineReducers({
  joke
});

export default rootReducer;

Sagas

import { call, put, takeEvery, takeLatest, take, race } from 'redux-saga/effects'

import {FETCH_JOKE, FETCH_JOKE_SUCCESS, FETCH_JOKE_FAILURE, START_POLLING, STOP_POLLING } from '../actions';

import axios from 'axios';



function delay(duration) {
  const promise = new Promise(resolve => {
    setTimeout(() => resolve(true), duration)
  })
  return promise
}

function* fetchJokes(action) {
  while (true) {
    try {
      const { data } = yield call(() => axios({ url: ENDPOINT }))
      yield put({ type: FETCH_JOKE_SUCCESS, data: data })
      yield call(delay, 5000)
    } catch (e) {
      yield put({ type: FETCH_JOKE_FAILURE, message: e.message })
    }
  }
}

function* watchPollJokesSaga() {
  while (true) {
    const data = yield take(START_POLLING)
    yield race([call(fetchJokes, data), take(STOP_POLLING)])
  }
}

export default function* root() {
  yield [watchPollJokesSaga()]
}

您还可以使用 Redux-Observable,如果您想了解更多信息,请阅读此内容article https://bigbitecreative.com/polling-with-redux/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React redux api 每 x 秒轮询一次 的相关文章

随机推荐

  • 使用 .Net 和 SQL Server 2005 保存/加载图片的最佳方式?

    在销售产品的网页中处理产品图片的典型方法是什么 假设我有一个包含书籍或计算机组件等的数据库 例如 所有这些都有自己的示例图片 我应该将它们作为二进制数据保存到数据库中 还是以某种方式在代码隐藏中处理它们 将它们保存到一个目录中保存到数据库产
  • python中返回概率的多类线性SVM

    如何实现多类线性 SVM 它返回测试样本的概率矩阵 训练样本 mxn 火车标签 mxc 测试标签 mxc 其中列具有每个类别的概率 sklearn 中执行 one vs the rest 的函数线性SVC http scikit learn
  • 尝试在 C# 中使用 INATExternalIPAddressCallback 获取 NAT 外部 IP 地址

    如何使用 Windows 库获取 NAT 的外部 IP 地址 我正在尝试查找有关 INATExternalIPAddressCallback 的任何信息 但只在 C 中找到了一个使用不可用的 C 接口的示例 任何指导将不胜感激 Karl 抱
  • ruby 中 CSV.open( ) 的第二个参数/参数是什么?

    我想我在这里遗漏了一些非常明显的东西 但是每个人为 CSV open 方法输入的第二个参数是什么 在本例中是 wb 我已经看到这里放了其他字母 但没有人真正解释了它的作用 它有什么作用 CSV open path to file csv w
  • 即使选择数据库后也会出现“未选择数据库”错误

    我已经选择了数据库 但由于某种奇怪的原因 它仍然说它没有被选择 连接线 location localhost user user pass pass Database Selection link mysql connect locatio
  • UICollectionView PerformBatchUpdates:如果视图需要布局,则意外断言?

    如果我打电话 UICollectionView performBatchUpdates 从内部viewWillAppear 里面viewDidAppear 在这些方法之间 或者每当集合视图尚未由更大的 UIView 视图层次结构布局时 集合
  • 通过鼠标滚轮按下事件在网站上滚动了多少像素?

    我正在编写一个自定义滚动条并正在捕捉mousewheel事件 我使用它来调整我想要滚动的元素的scrollTop 向下滚动的像素数是否有标准 或者因系统而异 我在最新版本的 Firefox 中显示 114px 许多鼠标驱动程序允许您设置鼠标
  • UML 中的组合

    在 UML 图中考虑组合时 我们应该在逻辑或实现意义上使用它 这两个术语的示例 实施 机场将包含对国家 地区的引用 换句话说 一个国家是机场的一部分 逻辑 一个国家可以有零个或多个机场 换句话说 机场是国家的一部分 从上图中 哪种情况显示了
  • 使用 Google Apps 脚本,如何替换 Google 表格模板中的文本以制作新表格?

    我有一个谷歌表格 https docs google com spreadsheets d 17qtLpnFTiMoE6blELSTQhtxkWa1hjjzI PcaY 3cS1Q edit resourcekey null gid 465
  • 如何创建每 24 小时运行一次的活动?

    我需要每 24 小时运行一次 delete tags from tags left join tagowners on tags id tagowners tagId where tagowners tagId is null CREATE
  • 在Python中写入具有特定权限的文件

    我正在尝试创建一个仅用户可读和可写的文件 0600 唯一的方法是使用os open 如下 import os fd os open path to file os O WRONLY 0o600 myFileObject os fdopen
  • C 中枚举类型溢出?

    如果我有一个枚举类型 例如 enum week sunday 0 monday tuesday wednesday thursday friday saturday 我有 enum week day day saturday day 一天的
  • 从 Java 访问 Kotlin 类对象

    我有一个 Kotlin 类 它有一个类对象 例如 public class Foo public class object public val SomeValue Int 0 如果我从 Java 使用此类 如何访问类对象内的 SomeVa
  • postgres:从命令行在数据库中创建表

    我试图在 postgres 中创建一个表 但它最终出现在错误的数据库中 这就是我所做的 首先在我的 sql 脚本中创建一个用户和一个数据库 然后创建一个表 代码会解释更多 drop database if exists sinfonifry
  • 如何计算 django 连接表中对象的数量?

    我的问题很简单 我有Users谁拥有Assets or Assets属于用户的如果您愿意 但我无法检索其数量 计数 Assets each User有 我知道这对你们大多数人来说可能听起来很愚蠢 但我是 python django 来自 P
  • 浏览器在使用 CSS 缩放图像时通常使用什么算法?

    我想得到canvas以与 CSS 相同的视觉保真度渲染缩放图像 根据我的测试 在 Chrome 版本 43 0 2357 130 中完成 它似乎不是 Lanczos3 即使我的测试重采样范围 http entropymine com res
  • Java从受限层调用方法

    我什至不确定这是否可行 但我想询问社区的总体意见 我必须解决以下问题 我的项目有 2 层 一个核心层和一个业务层 该核心层提供业务层 这时候Business类就可以导入Core类 为所欲为了 核心类只能导入核心类并使用其方法 禁止访问业务类
  • Zend Framework 2 SOAP AutoDiscover 和复杂类型

    我正在准备 SOAP 服务器并使用以下代码生成 WSDL Controller action code if key exists wsdl params autodiscover new AutoDiscover autodiscover
  • getline 函数的多个分隔符,C++ [重复]

    这个问题在这里已经有答案了 我想逐字阅读文本 以简单的方式避免任何非字母数字字符 从带有空格和 n 的文本 进化 之后 我需要解决这个问题 以防还有 例如 第一种情况只需使用带有分隔符 的 getline 即可解决 我想知道是否有办法使用g
  • React redux api 每 x 秒轮询一次

    我已经做到了这一点 但我正在寻求一种更 最佳实践的方法 它使用https icanhazdadjoke https icanhazdadjokeapi 显示一个随机笑话 每 x 秒更新一次 有更好的方法吗 最终我想添加停止 启动 重置功能