解决多个Tabs频繁切换造成数据错乱问题的方案

2023-11-17

一. 利用axios的cancelToken

import { $post } from 'util/ajax';
import axios from 'axios';
const CancelToken = axios.CancelToken;

// post
let cancel;
export const getData = data => dispatch => {
    if (cancel !== undefined) {
        cancel();
    }
    $post({
        url: '',
        data,
        cancelToken: new CancelToken(c => { cancel = c; })
    }).then(res => {
        if (res) {
            
        } else {
            throw Error();
        }
    }).catch(error => {
        if (axios.isCancel(error)) {
        } else {
            console.log(`异常: ${error}`);
        }
    });
};


// get
let cancel;
export const getData = params => dispatch => {
    let type = '';
    if (cancel !== undefined) {
        cancel();
    }
    $get({
        url: '',
        params,
        cancelToken: new CancelToken(c => { cancel = c; })
    })
        .then(res => {
            
        })
        .catch(err => {
           
        });
};

二. 通过变量的作用域来控制

  1. 设置一个全局变量,例如let globalIndex1 = 0; 该变量只要不重新刷新浏览器就会保留在内存中。
  2. 再在函数内设置一个局部变量,const curIndex = ++globalIndex1;
  3. 理论上来说,任何时候curIndex 和 globalIndex1都是相等的;
  4. 但是接下来我们会在异步队列中使用这两个变量;
  5. 由于globalIndex1为全局的,所以在函数中使用它时,拿到的都是最新的,而curIndex由于为局部变量,它的值为当前函数作用域中的值;
  6. 故:只有当异步队列为空的时候,curIndex 和 globalIndex1才是相等的。
  7. 而curIndex 和 globalIndex1相等时,说明最后一次tab点击和最后一次ajax请求吻合上了。
let globalIndex1 = 0;
export const getGridData = params => dispatch => {
    const curIndex = ++globalIndex1;
    const finish = () => curIndex === globalIndex1 && dispatch(actionCreator(UPDATE_DATA)({}));
    $get({
        url: '',
        params
    }).then(res => {
        finish();
    }).catch(finish);
};

举例分析第二个方案:

let globalIndex1 = 0;
export const getGridData = params => dispatch => {
    // 块1
    const curIndex = ++globalIndex1;  
    const finish = () => curIndex === globalIndex1 && dispatch(actionCreator(UPDATE_DATA)({}));
    // 块2
    $get({
        url: '',
        params
    }).then(res => {
        finish();
    }).catch(finish);
};

假如有两个tab,tab1和tab2

  1. 当点击tab1,调用getGridData,
    在块1:
    此时globalIndex1为1,curIndex=1
    在块2:
    将$get放入异步队列

  2. 当点击tab2,调用getGridData,
    在块1:
    此时globalIndex1为2,curIndex=2
    在块2:
    将$get放入异步队列

  3. 当点击tab1,调用getGridData,
    在块1:
    此时globalIndex1为3,curIndex=3
    在块2:
    将$get放入异步队列

  • 如果只执行1, 那异步回来之后,此时curIndex和globalIndex1相等,执行dispatch;
  • 如果执行1和2,且执行完2后,1的异步还没有回来,那么此时curIndex为1,globalIndex1为2,不相等;从队列继续获取第二个异步操作,此时curIndex为2,globalIndex1也为2,相等,故执行dispactch
// 进一步简化
<script>
   let i = 0; // 全局变量
   const fn = () => {
       // k为局部变量
       let k = ++i;
       const p = new Promise((resolve, reject) => {
           setTimeout(() => {
               resolve();
           }, 10);
       });
       p.then(res => {
           console.log('k', k);
           console.log('i', i);
       })
   };
   fn()
   fn()
   fn()
   fn()
   /**
    * 执行fn为同步的,所以执行4次fn i已经变成了4,然后再执行异步队列里的代码
    */
</script>

参考链接:

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

解决多个Tabs频繁切换造成数据错乱问题的方案 的相关文章

  • 使用webpack输出ES模块

    使用 Rollup 我可以通过简单地设置来输出 ES 模块format选项 es 我怎样才能用 webpack 做同样的事情 如果现在不可能的话 webpack 有计划添加吗 我在里面唯一找到的东西的文档output libraryTarg
  • 如何检查 Node.js 中是否设置了环境变量?

    我想检查我的环境变量是否设置快递JS https www npmjs com package express服务器并根据是否设置执行不同的操作 我试过这个 if process env MYKEY undefined console log
  • 需要使用 Node.js 压缩整个目录

    我需要使用 Node js 压缩整个目录 我目前正在使用node zip 每次该进程运行时都会生成一个无效的ZIP文件 正如您可以从这个 Github 问题 https github com Stuk jszip issues 41 是否有
  • Openshift 上的自定义 Node.js 版本

    我在运行自定义节点版本时遇到问题node0 10您可以在开放班次中找到墨盒here https github com DavidReinberger openshift meteor leaderboard customNode 我可以很好
  • Node.js 子进程

    我试图弄清楚这对于 node js 子进程来说是否是一个不错的用例 我有一款多人游戏 人们可以进行 1v1 比赛 我应该为每场比赛使用子进程吗 并不是真的需要 由于节点是基于事件的 并且单个进程将能够处理数千个这样的玩家对 您将为每个这样的
  • 如何在expressjs中调用另一个api?

    我有一个这样的API app get test req res gt console log this is test 和另一个API app get check req res gt I want to call test api wit
  • Webpack 加载器与插件;有什么不同?

    webpack 中的加载器和插件有什么区别 The 插件文档 https webpack github io docs using plugins html只是说 使用插件添加通常与 webpack 中的捆绑包相关的功能 我知道 babel
  • Angular 2 的最佳模块加载器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我已经使用了 JavaScript 和 Angular JS 1 AMD requireJS Brow
  • 多个 Nodejs 应用程序的单点登录

    我们有 3 个 Nodejs Web 应用程序 在具有多个子域的同一 vps 上的同一域名上运行 并为每个应用程序实现护照身份验证 我们希望单个用户能够使用单个帐户访问所有应用程序 因此我们仅出于帐户管理的目的添加了accounts exa
  • 如何从 docker 容器运行 webpack 构建?

    我正在制作的应用程序是用 ES6 编写的 其他好东西是由 Docker 容器内的 webpack 转译的 目前 一切工作从创建内部目录 安装依赖项到创建编译的捆绑文件 当运行容器时 它说 dist bundle js 不存在 除非我在主机目
  • 使用 Sequelize 计算关联条目数

    我有两张桌子 locations and sensors 每个条目在sensors有一个外键指向locations 使用 Sequelize 如何获取所有条目locations以及条目总数sensors与每个条目相关联locations R
  • 将 AngularJS 应用程序部署到普通 Apache HTTP 服务器是一种常见的选择吗?

    我很好奇 AngularJS 应用程序通常部署到什么样的服务器上 Google 没有给出令人满意的答案 特别是 在我看来 AngularJS 应用程序只是静态文件的集合 因此在生产中将这样的应用程序部署到普通 Apache HTTP 服务器
  • 在 iframe/对象标签内运行时更新初始路由器 url

    我目前正在容器 主 Vue 应用程序的对象标签 iframe 也可以工作 内渲染 Vue 应用程序 首先 我设置一个文件服务器 为该容器或请求的子应用程序提供服务 以在 div 内呈现 为了简单起见 我将仅显示 Node Express 服
  • 如何在 NodeJS 中使用 PhantomJS 模拟鼠标悬停或在页面上运行 JS 功能

    NodeJS PhantomJS 使用 Cheerio 进行内容解析 需要解析包含动态加载的div 提示 的网页 该事件可以在许多表 td 上 这是一个示例 当我将鼠标悬停在特定的 td 上时 我看到这个带有数据的橙色块 它动态加载了函数
  • 如何使用 javascript 从 UUID v1 (TimeUUID) 中提取时间戳?

    我使用 Cassandra DB 和 Nodejs 的 Helenus 模块来操作它 我有一些包含 TimeUUID 列的行 如何在javascript中从TimeUUID获取时间戳 这个库 UUID 至今 https github com
  • 如何使用restify上传文件

    我正在尝试使用 Restify 模块将图像文件上传到 Rest 服务器 更具体地说是 Confluence 但出现断言错误 我不确定我是否使用正确的方法将文件上传到 REST 服务器 有人能指出我正确的方向吗 这是我的尝试 var rest
  • JavaScript 中的 Promise.all:如何获取所有 Promise 的解析值?

    我编写了以下node js文件 var csv require csv parser var fs require fs var Promise require bluebird var filename devices csv var d
  • 在 NPM 上捆绑并发布客户端 Web 代码

    我制作了一个 JavaScript 文件 假设它的内容是这样的 let myCoolAlert str gt alert str in a different js file SO doesn t allow you to cross fi
  • sh:1:节点:权限被拒绝

    尝试在 ubuntu 18 04 上运行此命令 npm install g pngquant bin 但我得到了这个错误 fetchMetadata sill resolveWithNewModule email protected cdn
  • 垃圾收集器不适用于 NodeJS / Chrome 中的类型化数组

    我最初将其记录为原项目中的一个问题 https github com nodejs help issues 3590 它立即转移到帮助主题 没有很好的解释 所以现在我想在这里提问 如果我们在 NodeJS v14 v16 v17 中运行以下

随机推荐

  • 解决 “/lib64/libc.so.6: version `GLIBC_2.18‘ not found (required by /lib64/libstdc++.so.6)“

    https blog csdn net wiborgite article details 87707938
  • 基于RedHat 8.2源码编译升级Kernel 5.8.1

    1 基于RedHat 8 2源码编译升级Kernel 5 8 1 1 1 背景 只是单纯为了验证工作中遇到的一个bug 才诞生了此文 1 2 先从如下网址下载内核源码包 我这里下载的是 linux 5 8 1 tar gz 大家可根据自己需
  • 无监督深度估计、运动估计的深度学习方法(二)——SSIM损失函数

    在自监督深度估计中 一般输入2张图像 若为视频 则输入邻近的两帧图像 frame1和frame2 模型先估计相机拍摄这2张图像是的姿态变化pose 然后根据pose将frame1变换到frame2的视角下 得到合成图像synthetic f
  • 数据类型:C++中的基本数据类型

    数据类型 C 中的基本数据类型 在C 中 数据类型是用于存储不同种类数据的变量类型 C 提供了多种基本数据类型 包括字符型和数值类型 本篇博客将详细介绍C 中的基本数据类型 并提供相应的示例代码 目录 引言 字符型数据类型 2 1 char
  • Mysql数据备份-定时自动备份dump备份命令

    登录数据库服务器并打开命令行工具 如Windows系统中的cmd exe 或图形化管理工具 如phpMyAdmin Navicat等 根据数据库类型 执行相应的备份命令 例如 MySQL数据库可以使用以下命令导出备份 mysqldump u
  • 数仓分层理论

    数据仓库 在实际工作中 数仓分层 元数据管理 数据质量管理一直是一个持续优化的过程 我们公司业务也是在持续的做数仓的优化工作 在数据治理这方面还是欠缺很多的经验的 下面先简单整理了一下第一个理论部分的相关笔记 数据仓库理论 数据仓库四大特征
  • 锐捷ap设置为路由模式_路由器AP、路由、桥接模式有什么区别【详细介绍】

    现在的路由大多数已经开始支持多种网络连接模式 那么我们就挑一款模式最全的路由来了解各种模式的区别吧 下文将以TP Link迷你无线路由器为例 在TP Link迷你无线路由器上一般有AP 接入点 模式 Router 无线路由 模式 Repea
  • stm32——EXTI

    EXTI 外部中断 是stm32的众多外设之一 属于中断的一种 它最重要的就是通过检测外部引脚口的电平变化 比如说上升沿 下降沿 以及双边沿 来触发中断 让主程序放下当前的事情 去执行发生中断时应该执行的事情 设置好的函数 大概是如上所属
  • SpringBoot集成OAuth2.0的四种授权方式

    背景 OAuth 开放授权 是一个开放标准 允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息 而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容 OAuth2 0 是OAuth协议的延续版本 但不向后兼容 OAuth
  • Numpy掩码数组masked arrays,这一篇就够了

    Numpy掩码数组masked arrays 这一篇就够了 1 什么是掩码数组 2 示例 2 1 一个例子走进掩码数组 2 2 创建一个数组第二个值是无效的 2 3 创建一个数组所有靠近1 e20的值是无效的 2 4 只获取有效项 2 5
  • 8647服务器装系统,机柜系统资料的.doc

    机柜系统资料的 机房冷通道 机柜系统分为节能系统 机柜 走线系统和配电系统 随着数据中心数据量的飞块速增长 数据中心的能耗量越来越高 主要由运行高功率的IT设备所致 且这些IT设备的密度还在不断提高 IT设备运行所产生大量的热 是数据中心所
  • MySql登录方法

    登录mysql u 用户名 p 用户对应密码 h 主机 socket IP地址 端口号 eg 192 168 10 113 3306 1 方法 mysql u root p密码 mysql u root p mysql hlocalhost
  • shineblink MPU6050六轴传感器测量物体姿态角

    MPU6050六轴传感器测量物体姿态角 一 姿态角 欧拉角 基本概念 二 代码实现功能描述 三 接线图 五 完整代码 六 代码运行结果 七 需要注意的地方 一 姿态角 欧拉角 基本概念 物体在空间中的姿态可以用欧拉角来定义 欧拉角包含pit
  • 数据分析——最小二乘法建立线性回归方程(最简单的一元线性模型为例)

    概述 别看公式多 其实很简单 最小二乘法其实又叫最小平方法 是一种数据拟合的优化技术 实质上是利用最小误差的平方寻求数据的最佳匹配函数 利用最小二乘法可以便捷的求得未知的数据 起到预测的作用 并且是的这些预测的数据与实际数据之间的误差平方和
  • Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

    io uring是 2019 年 Linux 5 1内核首次引入的高性能异步 I O 框架 能显着加速 I O 密集型应用的性能 但如果你的应用已经在使用传统 Linux AIO 了 并且使用方式恰当 那io uring并不会带来太大的性能
  • 2023年最新Python安装详细教程

    目录 一 python官网 二 在官网的Downloads栏目 选择对应的操作系统 三 进入windows对应的页面 选择python版本 1 选择python的稳定发布版本Stable Releases 2 下载python的安装程序Wi
  • SO_RCVTIMEO超时errno

    首先打印一次recv调用失败的errno值和各个宏的值 由上可知 EAGIN和EWOULDBLOCK的值都是11 其实EAGIN是在setsockopt设置SO RCVTIMEO或SO SNDTIMEO后 recv或者send系列函数超时等
  • Centos 安装KVM并安装虚拟机

    需要注意的地方 如果修改了虚拟机XML配置 需要停止虚拟机 然后使用以下命令重新读取XML配置 virsh define etc libvirt qemu centos7 xml Linux服务器两块独立的网卡最好不要配置同一网段的IP地址
  • sam分类算法python代码_Python性能鸡汤_实践Sam

    Python性能鸡汤 一文见 http www oschina net question 1579 45822 下面是关于其中一些点 我的实践 1 内建函数 2 join 连接字符串 l aa bb mystring join l prin
  • 解决多个Tabs频繁切换造成数据错乱问题的方案

    一 利用axios的cancelToken import post from util ajax import axios from axios const CancelToken axios CancelToken post let ca