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

js进阶笔记之Promise

目录

为什么用Promise

Promise的基本语法

Promise的then方法

then的链式调用

Promise的相关方法


为什么用Promise

JS代码分为同步代码和异步代码

同步: 代码依次执行,上一个任务完成后,下一个任务才执行

异步 遇到耗时任务不必等待其完成,继续执行后面的任务,如定时器,事件回调,ajax请求(axios) js是单线程的,先执行同步代码,后执行异步代码

异步的实现: 通过回调函数来执行的 ,异步容易造成回调地狱

需求 先发第一次请求,等这次请求回来再发另一次请求容易造成回调地狱

为了优化异步流程->Promise

回调函数->Promise->generator->async await

Promise的基本语法

Promise是一个内置构造函数,接受一个函数(executor)作为参数,

该参数函数立即调用,该执行函数可以放同步或异步,

参数函数接受两个形参  resolve   ,reject  ; resolve   ,reject  是函数
 resolve()调用表示成功,reject()调用表示失败。

  const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')//  reject('失败')}, 1000)}))

Promise的then方法

​ promise实例身上有个then方法,then方法有两个参数 ​

第一个参数 成功时候的回调 ​

第二个参数 失败的时候的回调

promise三个状态 默认状态(等待态pending),成功态(fulfilled),失败态(rejected)

成功了就不能失败

      const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')// 成功了就不能失败//  reject('失败')}, 1000)})// promise实例身上有个then方法, then方法有两个参数// 第一个参数 成功时候的回调// 第二个参数 失败时候的回调promise.then((data) => {console.log(data)return new Promise((resolve, reject) => {setTimeout(() => {resolve('data数据2')}, 1000)})},(reason) => {console.log(reason)}).then((data) => {console.log(data)})console.log(456)

then的链式调用

return 的是 基本数据   ,会走下一个then 成功回调
出错了 , 走下一个then失败回调
返回一个promise实例,它成功走then的成功回调,它失败走then的失败回调

const promise = new Promise((resolve, reject) => {//  任务// console.log(123)setTimeout(() => {console.log('执行')resolve('data数据')// 成功了就不能失败//  reject('失败')}, 1000)})promise.then((data) => {console.log(data)// return 基本数据 会走下一个then成功回调// 出错了 走下一个then失败回调// 返回一个promise实例,它成功走then的成功回调,它失败走then的失败回调// return 'hello'//  throw 123return new Promise((resolve, reject) => {resolve('ok')})},(reason) => {console.log(reason)}).then((data) => {console.log(data)},(r) => {console.log(r)})console.log(456)

Promise的相关方法

promise 6个静态方法:all( ) , any( ), race( ) , allSettled( ) ,reject( ), resolve( )

all
Promise.all( )返回值是promise实例
接收一个数组,数组里可以放多个promise对象
Promise.all( ).then(res)  拿到结果 

静态方法Promise.all( [promise1, promise2,promise3])返回是一个promise
只要有一个失败就不走了,打印失败的信息,就走第二个回调
所有的都成功了,才走then的第一个回调

或者在then后面用.catch(){ }捕获错误的信息

     const p1 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok1')resolve('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok3')resolve('ok3')}, 1000)})Promise.all([p1, p2, p3]).then((res) => {console.log(res) // [p1的成功结果,p2的成功结果,p3的成功结果,]//) ['ok1', 'ok2', 'ok3']}).catch((err) => {console.log(err)})


allSettled静态方法
Promise.allSettled( )返回数组中每一promise的状态,值
不论成功或失败都能获取每一个promise的具体值

allSettled得到每一个promise的详细结果,无论该promise是成功还是失败

  const p1 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok1')resolve('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok3')resolve('ok3')}, 1000)})Promise.allSettled([p1, p2, p3]).then((res) => {console.log(res)}).catch((err) => {console.log(err)})

race()
Promise.race( [  ])只要谁先执行完,就打印谁的结果
Promise.race()谁先回来(不管成功还是失败)就打印谁的结果

   const p1 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok1')resolve('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok3')resolve('ok3')}, 1000)})Promise.race([p1, p2, p3]).then((res) => {console.log(res) //ok2}).catch((err) => {console.log(err)})

any()
Promise.any( )
得到第一个成功的promise
都不成功打印都失败了

  const p1 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok1')resolve('ok1')}, 3000)})const p2 = new Promise((resolve, reject) => {setTimeout(() => {resolve('ok2')//reject('出错啦')}, 1000)})const p3 = new Promise((resolve, reject) => {setTimeout(() => {// reject('ok3')resolve('ok3')}, 1000)})Promise.any([p1, p2, p3]).then((res) => {console.log(res) }).catch((err) => {console.log(err)})

Promise.reject()得到一个失败的promise
Promise.resolve()得到一个成功的promise
相当于new了一个promise
catch() 可以拿到错误

相关文章:

  • 第一章 分别使用Create-React-App、Vite、Umi Max搭建React项目
  • Linux:进程间通信
  • 【【FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验】】
  • 深入理解同源限制:网络安全的守护者(下)
  • css 3D背景反转实现
  • NIO--07--Java lO模型详解
  • 如何打印社保参保凭证
  • python之pyqt专栏5-信号与槽1
  • 钉钉聊天审计软件有哪些
  • web前端之vue3
  • cyclictest 交叉编译与使用
  • 【ArcGIS Pro微课1000例】0040:ArcGIS Pro创建北极点、南极点
  • 公平锁和非公平锁以及他们的实现原理是什么
  • YOLOv5算法进阶改进(7)— 将主干网络SPPF更换为SimSPPF / SPP-CSPC / SPPF-CSPC
  • node.js-连接SQLserver数据库
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • Android 架构优化~MVP 架构改造
  • java概述
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL的数据类型
  • Mysql数据库的条件查询语句
  • oldjun 检测网站的经验
  • React Transition Group -- Transition 组件
  • Terraform入门 - 1. 安装Terraform
  • 关于使用markdown的方法(引自CSDN教程)
  • 基于Android乐音识别(2)
  • 前端面试总结(at, md)
  • 我与Jetbrains的这些年
  • 项目实战-Api的解决方案
  • 一文看透浏览器架构
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • (2)MFC+openGL单文档框架glFrame
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)llvm ir转换过程
  • (二)fiber的基本认识
  • (二)正点原子I.MX6ULL u-boot移植
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (九)信息融合方式简介
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)使用VMware vSphere标准交换机设置网络连接
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core中的去虚
  • .NET Framework杂记
  • .NET 中让 Task 支持带超时的异步等待
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .net下的富文本编辑器FCKeditor的配置方法
  • .NET中统一的存储过程调用方法(收藏)
  • @RunWith注解作用