js高级进阶:promise同步编程技巧

news2024/9/22 21:36:16

promise是ES6引进的异步编程解决方案,是一个构造函数,可以实例化对象,可以解决回调地狱的问题。
首先我们看一下promise的实例化对象是什么:

 let P = new Promise(function(){});//new一个promise传入一个函数
 console.log(P);

打印结果:在这里插入图片描述可以看到promise是一个对象 有自己的原型,有then,catch等方法

promise的参数
promise的参数是一个函数 这个函数有两个参数 分别是reject(失败的回调)和resolve(成功的回调)。
resolve的用法:

    let P = new Promise(function(resolve ,reject ){
      /*函数体执行完之后调用resolve*/
      resolve('成功')
    });
    P.then((res)=>{
      console.log(res);
    })

打印结果:
在这里插入图片描述
在函数体执行完之后调用resolve(),结果会走then()方法

reject的用法

    let P = new Promise(function(resolve ,reject ){
      /*还是执行完之后调用reject*/
      reject('错误')
    });
    P.catch(function(err){
      console.log(err);
    })

打印结果:
在这里插入图片描述
在函数体执行完之后调用reject(),结果会走catch()方法

promise的then方法使用:

浏览器编译遇见then()方法调用promise实例,并在函数调用resolve()之后编译then()中的函数体

    var num = 1;
    let P = new Promise(function (resolve, reject) {
      setTimeout(function () {
        num = 2;
        resolve();
      }, 2000);
    });
    P.then(function (res) {
      console.log(num); // 浏览器编译遇见then()方法会走promise函数体 在函数体调用resolve()之后再编译then()的函数体 两秒之后num重新赋值为2 此时为2
    });
    console.log(num); // 直接打印num 此时为1

promise的catch方法使用:

用法和then()一样
在浏览器编译遇到reject()时调用。

promise的all方法使用:

    let P = new Promise(function (resolve, reject) {
      setTimeout(function () {
        resolve();
      }, 2000);
    });

    let P2 = new Promise(function (resolve, reject) {
      setTimeout(function () {
        resolve();
      }, 5000);
    });
    Promise.all([P, P2]).then(function () {
      alert(111);// 5秒之后弹出 
    });

all()方法传入一个数组,这个数组的元素是多个promise实例,在所有实例执行完之后执行then()方法。 

 

工作中遇到的问题:多个请求同步执行

 比如我有一个上传文件的需求,但是,每次只能上传一个文件,而且只能同步执行上传请求,不能一下全都发送过去,所以就需要使用同步执行多个上传请求:需要配合for循环和promise一起使用,for循环多个文件,await 一个promise请求,当promise执行完之后,再循环下一次:

const startUpFiles = async () => {
  console.log("开始多文件上传", fileList);
  for (let index = 0; index < fileList.length; index++) {
    const uploadFile = fileList[index];
    // console.log("file---", element.name);
    await new Promise((resolve, reject) => {
      // 当前日期
      var date = new Date()
      var reader = new FileReader()
      var uploadType = getType(uploadFile.raw.type, uploadFile)
      reader.readAsDataURL(uploadFile.raw)
      reader.onload = function (event: any) {
        // 用于预览图片
        var uploadFileRaw = reactive({
          name: uploadFile.name,
          path: uploadType === 'picture' ? event!.target.result : "",
          type: uploadType,
          size: (uploadFile.size / 1024 / 1024).toFixed(2).toString() + "M",
          sha: "",
          openLink: 'https://element-plus.gitee.io/',
          downLink: 'https://element-plus.gitee.io/',
          htmlLink: '',
          creatTime: `${date.getFullYear()}-${date.getMonth() + 1
            }-${date.getDate()}`,
          selected: false,
          showTips: false,
          uploading: true,
        })
        gitFileList.push(uploadFileRaw)
        // 用于上传图片
        fileApi.uploadFile(`${filePath.value}/${uploadFile.name}`, {
          "message": "Upload From FileHub",
          "content": event!.target.result.split("base64,")[1]
        }).then((res: any) => {
          console.log("上传文件返回:", res);
          if (res.status === 201) {
            uploadFileRaw.uploading = false
            uploadFileRaw.path = res.data.content.path
            uploadFileRaw.sha = res.data.content.sha
            uploadFileRaw.openLink = uploadType === 'picture' ? `${uStore.fileCdn}${res.data.content.path}` : `${uStore.gitIoCdn}/${res.data.content.path}`
            uploadFileRaw.downLink = uploadType === 'picture' ? `${uStore.fileCdn}${res.data.content.path}` : `${uStore.gitIoCdn}/${res.data.content.path}`
            uploadType === 'picture' && imgPreList.push(`${uStore.fileCdn}${res.data.content.path}`)
            console.log("上传文件结果:", res, imgPreList)
            resolve("200")
            upPropress.value = index + 1
          } else {
            ElMessage.error("上传失败:" + res.data.message)
            gitFileList.splice(gitFileList.indexOf(uploadFileRaw), 1)
            reject("409")
            upPropress.value = index + 1
          }
        }).catch(error => {
          uploadFileRaw.sha = 'error'
          gitFileList.splice(gitFileList.indexOf(uploadFileRaw), 1)
          console.log("上传文件错误:", error);
          reject("409")
          upPropress.value = index + 1
        })
      }
    })
  }
}

但是这个请求之前,需要先拿到上传的多个文件列表:做一个防抖延时拿到所有的上传文件

// 上传文件回调事件
const handleUploadChange = (uploadFile: any, uploadFiles: any) => {
  console.log('handleUploadChange----', uploadFiles, fileList)
  fileList = uploadFiles
  upTimer && clearTimeout(upTimer)
  upTimer = setTimeout(() => {
    upTimer = null
    console.log('防抖 高频触发后n秒内只会执行一次  再次触发重新计时')
    startUpFiles() //说明此时change了所有文件了 可以上传了
  }, 1000)
  console.log('gitFileList-----', gitFileList)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759203.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读发布!设计与部署稳定的分布式系统(第2版)笔记23_互联层之DNS

1. 互连层是可以真正构建高可用性的地方 1.1. 流量管理 1.2. 负载均衡 1.3. 服务发现 2. 不同规模的解决方案 2.1. 在小公司中 2.1.1. 只有少数开发人员的小企业可以直接使用DNS条目 2.1.2. 生成变更的开发人员较少&#xff0c;变更频度变低 2.1.3. 可能根本就没有独立…

高阶C语言|指针的进阶

指针的主题&#xff0c;在指针初阶阶段&#xff0c;我们知道了指针的概念&#xff1a; 1.指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2.指针的大小是固定4/8个字节&#xff08;32为平台/64位平台&#xff09;。 3.指针是有类型&#xff0c…

java+springboot基于云的学习笔记系统设计与开发 _44va6

学习笔记系统按照权限的类型进行划分&#xff0c;分为管理员和用户共两个模块。系统实现登录、个人信息修改&#xff0c;还可以对个人中心&#xff0c;用户管理&#xff0c;笔记本管理&#xff0c;笔记分享管理&#xff0c;分享类型管理&#xff0c;学习资料管理&#xff0c;购…

Makefile:10分钟带你了解makefile

1、Makefile是什么 在Linux系统中&#xff0c;Makefile是一个脚本文件&#xff0c;通常名为Makefile或者makefile&#xff0c;它使得程序员能够快速便捷地完成调用程序、编译代码、定位故障等工作。 Makefile是一个用于自动化构建和编译程序的脚本文件。它包含了程序的所有源…

Ubuntu下配置Redis哨兵集群

目录 准备实例和配置 启动哨兵集群 测试配置 搭建一个三节点形成的Sentinel集群&#xff0c;来监管Redis主从集群。 三个sentinel哨兵实例信息如下&#xff1a; 节点IPPORTs1192.168.22.13527001s2192.168.22.13527002s3192.168.22.13527003 准备实例和配置 要在同一台虚…

01. Docker基础环境构建

目录 1、前言 2、关于Docker 2.1、几个术语 2.2、Docker容器化的价值 3、搭建基础环境 3.1、安装VMware 3.2、安装Doker 3.3、启动 3.4、验证Docker环境 4、小结 1、前言 在这里我们将学习关于Docker的一些技能知识&#xff0c;那么首先我们应该怼Docker有一个基础的…

服务器离线部署docker,镜像迁移,mysql主从搭建等服务

公司项目要上线项目&#xff0c;买了两台云服务器&#xff0c;需进行环境部署&#xff08;1台接入公网&#xff0c;一台只能局域网访问&#xff09;&#xff0c;主要部署以下内容 1、服务器之间配置ssh免密 2、离线docker部署 3、docker镜像迁移 4、redis服务 5、minio文件…

Idea配置Maven优先从本地仓库获取依赖

idea配置maven依赖优先从指定本地仓库获取 在设置中搜索 Runner ,在VM Option中设置参数-DarchetypeCataloginternal <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

沐风老师MaxScript快速入门教程

Maxscript是将自定义3dMax应用的更强大的方法之一。结合内置的侦听器和编辑器&#xff0c;我们在运行时操作和测试代码&#xff0c;使其成为用户试验和探索改进软件体验的强大选项。通过Maxscript&#xff0c;我们几乎可以操作软件中的每一个对象&#xff0c;包括但不限于&…

【C++】-vector的模拟实现(以及memcpy如何使用)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

Spring-MVC的注解扫描-spring17

包括我们业务层和Dao层&#xff0c;去帮助别人去扫 只扫controller下的注解

00_YS_硬件电路图

1.主控制芯片的型号 STM32F407IGT6&#xff0c;LQFP-176&#xff0c;1MB 内部 FLASH&#xff0c;192KB RAM USART3 RS485 通信&#xff0c;芯片使用 SP3072EEN; UART5 RS232 通信&#xff0c; CAN 1 路&#xff0c;型号 SN65HVD230 USB 支持 …

Python应用实例(二)数据可视化(三)

数据可视化&#xff08;三&#xff09; 1.使用Plotly模拟掷骰子1.1 安装Plotly1.2 创建Die类1.3 掷骰子1.4 分析结果1.5 绘制直方图1.6 同时掷两个骰子1.7 同时掷两个面数不同的骰子 1.使用Plotly模拟掷骰子 本节将使用Python包Plotly来生成交互式图表。需要创建在浏览器中显示…

代码随想录算法训练营第十九天 | 动态规划系列5,6,7,8

动态规划系列5,6,7,8 377 组合总和 Ⅳ未看解答自己编写的青春版重点代码随想录的代码我的代码(当天晚上理解后自己编写) 爬楼梯进阶322 零钱兑换未看解答自己编写的青春版写完这道题后的感受重点代码随想录的代码动态规划&#xff0c;也要时刻想着剪枝操作。我的代码(当天晚上理…

异常执行结果随笔

前段时间有朋友问我异常执行顺序问题&#xff0c;这里简单记录下哈。 伪代码描述&#xff0c;当j0和j1&#xff0c;输出结果分别是什么&#xff1f; int i 0; int j 0或1; try {j i / j&#xff1b;System.out.println(i);return i; } catch (Exception e) {System.out.pri…

win10如何使用wsl配置Ubuntu并使用vscode连接

文章目录 0. 前置资料1. 下载wsl2. 下载Ubuntu3. vscode连接wsl 0. 前置资料 wsl为适用于 Linux 的 Windows 子系统&#xff0c;可参考以下微软的官方文档 https://learn.microsoft.com/zh-cn/windows/wsl/ 1. 下载wsl 点击屏幕左下角的放大镜&#xff0c;直接在输入框键入P…

第 354 场LeetCode周赛

A 特殊元素平方和 模拟 class Solution { public:int sumOfSquares(vector<int> &nums) {int res 0;int n nums.size();for (int i 0; i < n; i)if (n % (i 1) 0)res nums[i] * nums[i];return res;} };B 数组的最大美丽值 差分数组: n u m s [ i ] nums[…

cmake处理参数时的一些问题说明

cmake处理参数时的一些问题说明 函数传参空格和分号的坑函数转发的坑demo 函数传参遇到不平衡方括号的坑 函数传参空格和分号的坑 我们在处理函数和宏的时候不过不小心会遇到很多坑例如: someCommand(a b c) someCommand(a b c)因为cmake中使用空格或者分号分隔符所以上面代…

Django实现接口自动化平台(十一)项目模块Projects序列化器及视图【持续更新中】

相关文章&#xff1a; Django实现接口自动化平台&#xff08;十&#xff09;自定义action names【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解&#xff0c;查看本章内容时&#xff0c;要结合整体项目代码来看&#xff1a; python django vue httprunner …

LangChain 本地化方案 - 使用 ChatYuan-large-v2 作为 LLM 大语言模型

一、ChatYuan-large-v2 模型 ChatYuan-large-v2是一个开源的支持中英双语的功能型对话语言大模型&#xff0c;与其他 LLM 不同的是模型十分轻量化&#xff0c;并且在轻量化的同时效果相对还不错&#xff0c;仅仅通过0.7B参数量就可以实现10B模型的基础效果&#xff0c;正是其如…