当前位置: 首页 > news >正文

浅谈es5如何保证并发请求的返回顺序

最近在公司实习写的是es5,在和回调地狱经过一番拉扯之后写下这篇文章,也算是体验了一把没有promise的时代
假设我们的div有一个日历列表,但是由于大小关系只能每次显示2天的信息,项目限制只能使用es5,不能使用es6的promise,且后端给我们的接口只能每次请求一个具体日期的数据
例如

getDateInfo(2023,7,26)//return
{
date:'12',
lunar:'五月廿五',
weekday:'周六'
}

在这里插入图片描述
现在的需求是首屏加载2个item,有些人会觉得这还不简单吗,先请求第一个,再在回调里面请求第二个
确实如此,那假如我们有20个,200个item呢,就会掉入回调地狱,还有一个问题就是前面的请求失败会导致后面的请求无法执行(即使后面的请求单独可用)

那么此时我们就需要

并发请求

首屏加载的onload中同时请求两次

getListItem(date) {var success = function(res) {console.log(res.date)//更新数据和视图
}
getDateInfo(2023,7,date,success)
getDateInfo(2023,7,date+1,success)
}getListItem(date)

那么新的问题来了,我们的日期列表需要按顺序展示,但是我们本地的数组是通过请求回来再在回调里存到数组中的,
由于网络的不可控性,我们不知道哪个请求会先被返回回来,那么如何保证顺序呢

错误做法:

使用闭包传参,在回调中用参数当索引修改数组,例如上面传的date和date+1,因为在执行回调的时候所有同步代码已经执行完毕,既然传的是同一个回调函数的地址,那么找到的是同一个作用域,里面的date已经递增完毕,所以所有回调取到的都是date+1,也就是最后一个传入值

es5保证回调顺序的两种正确方式

1.接口返回我们传入的参数,或者能当作顺序标识符号的属性,例如id,然后我们在给数组赋值的时候,对id做处理得出数据先后顺序的索引index,再用arr[index]为数组赋值,因为是返回的数据,所以总能取到正确的值,这种方式要求接口要返回对应的标识或者顺序属性,不过绝大部分接口都会有

2.给每一个请求传入不同的回调函数(引用地址不同),例如

var success1 = function(res) {console.log(res.date)//更新数据和视图
}
var success2 = function(res) {console.log(res.date)//更新数据和视图
}
getDateInfo(2023,7,date,success1)
getDateInfo(2023,7,date+1,success2)

那么我们就可以在各自的回调函数中写入固定的索引去更新数据和视图,而不是使用index这种变量作为索引,但是这种方式会增加代码量,会产生许多重复的冗余代码

如果有别的可以保证返回顺序的方式,欢迎评论区讨论

本文由Escaay原创,转载请注明出处

相关文章:

浅谈es5如何保证并发请求的返回顺序

最近在公司实习写的是es5,在和回调地狱经过一番拉扯之后写下这篇文章,也算是体验了一把没有promise的时代 假设我们的div有一个日历列表,但是由于大小关系只能每次显示2天的信息,项目限制只能使用es5,不能使用es6的pro…...

深入浅出Pytorch函数——torch.squeeze

分类目录:《深入浅出Pytorch函数》总目录 相关文章: 深入浅出Pytorch函数——torch.squeeze 深入浅出Pytorch函数——torch.unsqueeze 将输入张量形状为1的维度去除并返回。比如输入向量的形状为 A 1 B 1 C 1 D A\times1\times B\times1\times C…...

【LeetCode】121.买卖股票的最佳时机

题目 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大…...

【力扣】74. 搜索二维矩阵 <二分法>

【力扣】74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则&am…...

Spring Task+Cron表达式

不需要导入坐标spring-context(包含在了spring-boot-starter) 在启动类添加EnableScheduleing开启任务调度 单独建个定时任务包task,创建定时任务类MyTask 在定时任务类添加Component 在类的方法上添加Scheduled(cron “cron表达…...

你们公司的【前端项目】是如何做测试的?字节10年测试经验的我这样做的...

前端项目也叫web端项目(通俗讲就是网页上的功能)是我们能够在屏幕上看到并产生交互的体验。 前端项目如何做测试? 要讲清楚这个问题,先需要你对测试流程现有一个全局的了解,先上一张测试流程图: 测试流程…...

华为战略方法论:BLM模型之关键任务与依赖关系

内容简介 在 BLM 模型中,执行部分包括四个模块,分别是: 关键任务与依赖关系;组织与绩效;人才;氛围与文化。 详细内容,大家可以参看下面这张图。 这四个模块其实是可以进一步划分成两个关键点…...

django的ORM模板的fake更新

django存量数据表的migraions记录丢失,若要更新表结构,则需用到fake,否则报错: 解决步骤如下: 1)同步存量表结构,生成伪表 --fake sudo python3 manage.py makemigrations appname sudo pyt…...

239.滑动窗口最大值

leetcode原题链接 题目描述: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例1: 输入:nums [1,…...

Redis基础原理

1 概念 1.1 关系型数据库与非关系型数据库对比 关系型数据库Mysql、Oralce特点数据之间有关联;数据存储在硬盘上效率操作关系型数据库非常耗时 非关系型数据库redis、hbase存储key:value特点数据之间没有关联关系;数据存储在内存中缓存思想从缓存中获…...

.NET 5 Web API 中JWT详细教程:保护你的Web应用

第一部分: 理解JWT JSON Web Token(JWT)是一种在不同系统之间传递信息的安全方式。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。头部包…...

MyBatis-Plus自动填充

文章目录 一、前言二、MyBatis-Plus自动填充功能实现2.1、实体类上增加注解2.2、自定义填充类编写 一、前言 我们在建表的时候,所有的表都会有create_id(创建人id)、create_time(创建时间)、update_id(更新…...

Dubbo服务提供者失效踢出原理解析

Dubbo服务提供者失效踢出原理解析 在分布式系统中,服务提供者的失效是一个常见而且重要的问题。Dubbo作为一款优秀的分布式服务框架,提供了失效踢出机制来及时剔除不可用的服务提供者,确保系统的稳定性和可用性。本文将深入探讨Dubbo服务提供…...

el-select下拉框处理分页数据,触底加载更多

1、声明自定义指令: directives: {loadmore: {inserted(el, binding) {const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap);SELECTWRAP_DOM.addEventListener(scroll, function() {const condition this.scrollHeight - thi…...

如何设计自动化测试脚本?一文5个步骤带你从0到1设计

企业中如何设计自动化测试脚本呢?今天我们就来为大家分享一些干货。 一、线性设计 线性脚本设计方式是以脚本的方式体现测试用例,是一种非结构化的编码方式,多数采用录制回放的方式,测试工程师通过录制回访的访问对被测系统进行自…...

PostgreSQL实战-数据库迁移部署

PostgreSQL实战-数据库迁移部署 介绍 根据项目需求,我们需要将现有的PostgreSQL数据库重新部署到新的服务器上。由于项目本身就是基于PostgreSQL数据库构建的,因此数据库迁移将变得十分便捷。接下来,我将简要介绍我们的迁移步骤。 迁移步骤…...

PHP数据库

PHP MySQL 连接数据库 MySQL 简介MySQL Create 免费的 MySQL 数据库通常是通过 PHP 来使用的。 连接到一个 MySQL 数据库 在您能够访问并处理数据库中的数据之前,您必须创建到达数据库的连接。 在 PHP 中,这个任务通过 mysql_connect() 函数完成。 …...

Mybatis的基本操作--增删改查

目录 查看数据 无参数 一个参数 多个参数 添加数据 修改数据 删除数据 注释的方式进行查找数据 查看数据 分三种情况:无参,有一个参数,有多个参数的情况。 (这里的详细操作步骤是博主的上一篇博客写的:初识My…...

Qt简单实现密码器控件

本文实例为大家分享了Qt自定义一个密码器控件的简单实现代码,供大家参考,具体内容如下 实现构思: 密码器的功能可以看成是计算器和登陆界面的组合,所以在实现功能的过程中借鉴了大神的计算器的实现代码和登陆界面实现的代码。 …...

fpga_pwm呼吸灯(EP4CE6F17C8)

文章目录 一、呼吸灯二、代码实现三、引脚分配 一、呼吸灯 呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。 二、代码实现 c module pwm_led( input clk ,input rst_n ,output reg [3:0] led ); …...

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案

Phi-4-mini-reasoning实战教程:批量处理CSV数学题库生成标准答案 1. 引言 数学老师们经常面临一个共同挑战:批改大量数学作业和试卷需要花费大量时间。传统方法需要逐题检查,效率低下且容易出错。今天,我们将介绍如何利用Phi-4-…...

Qwen3-VL-30B部署避坑指南:从下载到运行一气呵成

Qwen3-VL-30B部署避坑指南:从下载到运行一气呵成 1. 为什么选择Qwen3-VL-30B Qwen3-VL-30B是目前通义千问系列中最强大的视觉-语言模型,它在多个方面实现了显著提升: 更优秀的文本理解和生成:能够处理复杂语义和长文本更深入的…...

GG3M 项目贝叶斯更新与决策数学的具体落地应用

GG3M贝叶斯决策体系:基于贾子公理的跨领域反熵增智慧决策应用摘要: GG3M项目以贾子公理体系为底层支撑,独创“事实层-模型层-元模型层”层级化贝叶斯架构,实现了从参数优化到认知框架迭代的范式突破。该体系以系统长期反熵增演化为…...

VCS编译SystemVerilog时,那个‘-P’选项你加对了吗?详解Verdi PLI配置

VCS编译SystemVerilog时,那个‘-P’选项你加对了吗?详解Verdi PLI配置 在芯片验证的日常工作中,VCSVerdi的组合堪称黄金搭档。但当你满怀信心地敲下编译命令,却发现怎么也生成不了关键的fsdb波形文件时,那种挫败感简直…...

SMR实战:如何将GWAS数据快速转换为BESD格式(附常见错误排查)

SMR实战:GWAS数据高效转换为BESD格式的完整指南与深度排错手册 在生物信息学研究中,基于汇总数据的孟德尔随机化(Summary-data-based Mendelian Randomization, SMR)已成为探索基因表达数量性状位点(eQTL)与…...

终极RPA档案解压指南:快速提取Ren‘Py游戏资源的完整教程

终极RPA档案解压指南:快速提取RenPy游戏资源的完整教程 【免费下载链接】unrpa A program to extract files from the RPA archive format. 项目地址: https://gitcode.com/gh_mirrors/un/unrpa 想要从RenPy视觉小说游戏中提取图片、音频和脚本资源吗&#x…...

Phi-3-mini-4k-instruct-gguf代码实例:Python requests调用Web API完整示例

Phi-3-mini-4k-instruct-gguf代码实例:Python requests调用Web API完整示例 1. 模型简介 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本,特别适合问答、文本改写、摘要整理和简短创作等场景。这个经过优化的版本可以直接…...

开源工具:IDM Activation Script彻底解决激活弹窗问题的技术方案

开源工具:IDM Activation Script彻底解决激活弹窗问题的技术方案 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xf…...

Boomer:轻量高效的Linux屏幕放大镜工具

Boomer:轻量高效的Linux屏幕放大镜工具 【免费下载链接】boomer Zoomer application for Linux 项目地址: https://gitcode.com/gh_mirrors/boo/boomer 当你需要精准查看屏幕细节时是否常感到操作繁琐?无论是设计工作中的像素级调整、编程时的代码…...

从一次系统升级说起:聊聊Android PMS如何管理/system/app下的预装应用

Android PMS深度解析:系统预装应用的管理艺术 1. 系统预装应用的特殊地位 在Android生态系统中,预装应用占据着独特的位置。这些位于/system/app目录下的应用与普通用户应用有着本质区别: 系统级权限:预装应用通常拥有更高的系统权…...