使用Promise解决多个请求数据并发问题

2023-05-16

首先引用一下阮一峰大佬的一段话:

Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

来看一下简单的Promise示例:

let promise = new Promise(function (resolve,reject) {
    console.log('Hello');
    resolve();
});
promise.then(function () {
    console.log('World!');
});
console.log('the');

猜测一下输出顺序是什么,好像提供的输出样例已经暴露了:

Hello
the
World!

Promise对象新建后立即执行,所以最先输出Hello
然后其状态由pending转化为resolved,输出the
最后then作为指定回调函数,当前脚本所有同步任务执行完才会执行

再来看一个实战演练:

<html>
    <script>
        function getData(str) {
            return new Promise((resolve, reaject) => {
                setTimeout(() => resolve(str), Math.random()*3000);
            })
        }
        function getAllData() {
            var all_str = '';
            getData('望').then(res => all_str += res);
            getData('子').then(res => all_str += res);
            getData('成').then(res => all_str += res);
            getData('龙').then(res => all_str += res);
            setTimeout(() => {
                document.getElementById('tripe').innerHTML = all_str;
            }, 3000)
        }
    </script>
    <body>
        <button onclick="getAllData()">获取数据</button>
        <div>
            <h1>内容都显示在这里</h1>
            <div id="tripe"></div>
        </div>
    </body>
</html>

一个很简单的请求多个数据的并发问题,这里需要处理的是,将请求到的数据按顺序排列,组成“望子成龙”四字成语,但是由于设置的存储时间是随机的,导致每次生成的数据顺序都是打乱的,怎么解决这个问题呢?
在这里插入图片描述

  1. 简单粗暴,直接把
setTimeout(() => resolve(str), Math.random()*3000);

改为

setTimeout(() => resolve(str), 0);

按照请求字符的顺序来,消除随机计时,确实,这种方法简单有效,但是为了练习Promise,所以使用第二种方法(别骂了,别骂了,水平有限,一时想不出来好的例子QAQ)
2. 通过设置Promise对象来实现请求顺序的排列,代码如下:

<html>
    <script>
        function getData(str) {
            return new Promise((resolve, reaject) => {
                setTimeout(() => resolve(str), 0);
            })
        }
        function getAllData() {
            var all_str = '';
            getData('望').then(res => all_str += res);
            var promise = new Promise(function (resolve,reject) {
                getData('子').then(res => all_str += res);
                resolve();
            });
            promise.then(function () {
                getData('龙').then(res => all_str += res);
            });
            getData('成').then(res => all_str += res);
            setTimeout(() => {
                document.getElementById('tripe').innerHTML = all_str;
            }, 3000)
        }
    </script>
    <body>
        <button onclick="getAllData()">获取数据</button>
        <div>
            <h1>内容都显示在这里</h1>
            <div id="tripe"></div>
        </div>
    </body>
</html>

效果如下:
在这里插入图片描述

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

使用Promise解决多个请求数据并发问题 的相关文章

随机推荐

  • pycharm如何查看python文件的工作目录

    在找bug的过程中发现python文件的工作目录和存放目录地址有可能是不一样的 xff0c pathlib路径操作中的pathlib Path cwd 获取的是工作目录而不是存放目录地址发现工作目录和存放目录地址不同的时候一定要修改过来 x
  • C++中vector的用法详解

    文章目录 构造函数增加函数删除函数遍历函数判断函数大小函数交换函数赋值函数改变空间 构造函数 span class token comment vector 创建一个空vector span vector span class token
  • 华为技术面

    文章目录 手撕代码流程题目描述方法介绍面试官评价思维扩展 项目描述技术问题内存说明下C 43 43 的内存分配情况 xff0c 栈和队列的区别以及程序员如何分配回收内存 xff1f C 43 43 程序员和Java程序员有一个很大的区别 x
  • 华东师范大学计算机学硕2023考研经验贴

    文章目录 1 个人经历1 1 一战1 2 二战1 3 心态 2 初试2 1 政治2 2 英语2 3 数学2 4 408 3 复试3 1 机试A 数字猜想B 特殊质数C 最小字符串D 数字排序E 整数分解 3 2 英语面试3 3 综合面试 1
  • Go后端部署服务器

    go后端部署服务器方式一 xff1a xff08 最简单 xff09 和暑假做重点场所项目部署一样 xff0c 简单 xff0c 无脑 xff0c 手动 xff0c 麻烦 span class token number 1 span spa
  • 数据分析实用python程序

    文章目录 1 pdf转txt2 判断txt文件是否为空3 获取txt文件每一行4 获取文件夹所有文件名5 读写xlsx表格6 遍历txt每个字符7 字符串中字符替换 1 pdf转txt span class token comment de
  • 51单片机之数码管

    1 静态数码管原理图 LED数码管根据LED的不同接法分为两类 xff1a 共阴和共阳 为了显示数字或字符 xff0c 必须对数字或字符进行编码 七段数码管加上一个小数点 xff0c 共计8段 因此为LED显示器提供的编码正好是一个字节 共
  • 银行排队模拟(队列)

    银行排队模拟程序 队列类Queue ifndef span class token constant QUEUE H span define span class token constant QUEUE H span struct Rec
  • C/C++中struct和class的区别

    目录 struct class struct和class的区别 struct struct是描述一个数据结构的集合 xff0c 像一周有七天 xff0c 你可以把一周看成是一个结构体 xff0c 然后在结构体里面定义一个数组来存放这个七天
  • java枚举(enum)使用详解

    文章目录 前言一 枚举类型定义二 访问成员三 遍历四 在switch xff08 xff09 中使用枚举五 方法1 内置方法1 1 ordinal 用于返回成员的索引1 2 compareTo 用于比较枚举类型中两个成员的索引值1 3 va
  • 分析url从输入到展过程中的页面优化、performance

    浏览器会开启一个线程处理URL请求 url从输入到展示页面的过程 1 输入网址 2 DNS解析 3 建立tcp连接 xff08 请求队列queuing 请求等待stalled 4 客户端发送HTPP请求 5 服务器处理请求 6 服务器响应请
  • 双重锁单例模式

    不忘初心 xff0c 思考梦开始的地方 普通的懒汉式和饿汉式都不用管 简单实现一下线程安全的方式 span class token keyword public span span class token keyword class spa
  • VScode神仙插件,程序员必备

    前言 Visual Studio Code VS Code 是微软2015年推出的一个轻量但功能强大的源代码编辑器 xff0c 基于 Electron 开发 xff0c 支持 Windows Linux 和 macOS 操作系统 它内置了对
  • 【Java】使用Java实现爬虫

    文章目录 使用Java实现爬虫一 HttpClient实现模拟HTTP访问1 1 HttpClient1 2 引入依赖1 3 创建简单的请求操作1 3 1 创建实例1 3 2 Jsoup应用 1 4 爬取过程中可能出现的问题1 4 1 JS
  • STM32 HAL库+ESP8266+华为云物联网平台

    文章内容 xff1a STM32 HAL库通过串口发送AT指令完成与ESP8266的控制实现接入华为云物联网平台 xff0c 并完成基本通信与控制 xff0c 包括设备属性上报和命令下发解析与响应 文末获取 STM32 HAL库 43 ES
  • MySQL事务篇

    文章目录 说明 xff1a 事务篇一 事务隔离级别是怎么实现的 xff1f 二 MySQL 可重复读隔离级别 xff0c 完全解决幻读了吗 xff1f 说明 xff1a 此类文章是为小林coding的图解MySQL xff0c 所简写 xf
  • Android studio TCP网络调试助手应用开发(支持TCP Server与Client切换)

    在前几篇的文章中带大家完成了基于TCP的物联网安卓应用开发 xff0c 教程内容是创建了一个TCP客户端并连接服务器完成数据通信的过程 xff0c 后不久又发布了一个ESP8266创建TCP 服务器与安卓的客户端进行通信的一个文章 xff0
  • 【FreeRTOS】中断管理

    在介绍本文之前 xff0c 向大家推荐个非常容易入门的人工智能学习网站 xff0c 建议点击收藏 目录 xff1a 1 前言2 内核提供两套API2 1 优点2 2 缺点2 3 常用API函数列表2 4 pxHigherPriorityTa
  • 【嵌入式基础】内存(Cache,RAM,ROM,Flash)

    1 前言 最近在看赛普拉斯的一款芯片CYW8019规格书 xff0c 里面有好几个内存的关键字 xff08 如下图的右上方 xff09 xff0c 本文将聊它们的含义和作用 2 Cache Cache是集成在CPU内部的极高速缓存 一般来讲
  • 使用Promise解决多个请求数据并发问题

    首先引用一下阮一峰大佬的一段话 xff1a Promise xff0c 简单说就是一个容器 xff0c 里面保存着某个未来才会结束的事件 xff08 通常是一个异步操作 xff09 的结果 从语法上说 xff0c Promise是一个对象