ES6:Promise详解

news/2024/7/10 22:53:41 标签: es6, javascript, 前端

ES6:Promise详解

  • 1、概念
  • 2、Promise有3种状态
  • 3、Promise和async和await的区别
  • 4、Promise API
  • 5、Promise是用来解决两个问题的:
  • 6、Promise的三个缺点
  • 7、Promise的两个特点
  • 8、Promise异步调用实例
  • 9、Promise、async、await执行顺序
  • 10、Promise实例

1、概念

Promise是JS中进行异步编程的新解决方案,相比回调函数和事件更合理和更强大。
从语法上来说:Promise是一个构造函数
从功能上说:Promise对象用来封装一个异步操作并可以获取其成功/失败的结果值

2、Promise有3种状态

  1. pending:初始状态也叫等待状态
  2. resolved:成功状态
  3. rejected:失败状态

状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

3、Promise和async和await的区别

什么是async/await?
async/await 是ES7提出的基于Promise的解决异步的最终方案。
区别:
1 promise是ES6,async/await是ES7
2 async/await相对于promise来讲,写法更加优雅
3 reject状态:
1)promise错误可以通过catch来捕捉,建议尾部捕获错误,
2)async/await既可以用.then又可以用try-catch捕捉
一个函数如果加上 async ,那么该函数就会返回一个 Promise
async 和 await 可以说是异步终极解决方案了,相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码,毕竟写一大堆 then 也很恶心,并且也能优雅地解决回调地狱问题。当然也存在一些缺点,因为 await
将异步代码改造成了同步代码,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。

4、Promise API

  1. Promise.resolve(value) 类方法,该方法返回一个以 value 值解析后的 Promise 对象
  • 如果这个值是个 thenable(即带有 then 方法),返回的 Promise 对象会“跟随”这个 thenable的对象,采用它的最终状态(指 resolved/rejected/pending/settled)
  • 如果传入的 value 本身就是 Promise 对象,则该对象作为 Promise.resolve 方法的返回值返回。
  • 其他情况以该值为成功状态返回一个 Promise对象。
  1. Promise.reject 类方法,且与 resolve 唯一的不同是,返回的 promise 对象的状态为 rejected。
  2. Promise.prototype.then 得到异步任务的正确结果
  3. Promise.prototype.catch 获取异常信息
  4. Promise.prototype.finally 成功或失败都会执行
  5. Promise.all() 接受Promise对象组成的数组作为参数,它的返回参数也是数组。当promise的全部为resolve后,它才会进入.then()方法,只要有一个promise为reject,它就会进入.catch()并发处理多个异步任务,所有任务都能执行完成才能得到结果。
  6. Promise.race() 接受的参数与Promise.all()一样,不同的是,它会辨别最快达到resolve或者reject的promise对象,如果这个最快是resolve,则进入.then()方法,如果是reject,则进入.catch()方法并发处理多个异步任务,只要有一个任务完成就能得到结果。

5、Promise是用来解决两个问题的:

★ 支持链式调用,可以解决回调地域问题
回调地狱:回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件
回调地狱缺点:不便于阅读;不便于异常处理
★ 指定回调函数的方式更加灵活

6、Promise的三个缺点

1)无法取消Promise,一旦新建它就会立即执行,无法中途取消
2)如果不设置回调函数,Promise内部抛出的错误,不会反映到外部
3)当处于pending(等待)状态时,无法得知目前进展到哪一个阶段,是刚刚开始还是即将完成

7、Promise的两个特点

1)Promise对象的状态不受外界影响
2)Promise的状态一旦改变,就不会再变,任何时候都可以得到这个结果,状态不可以逆

8、Promise异步调用实例

javascript">let p = new Promise((resolve, reject) => {
    setTimeout(() => {
    	resolve('OK');
    }, 1000);
});

p.then(value => {
    console.log(111);
    //有且只有一个方式(返回一个pending状态的Promise对象)
    return new Promise(() => {});
}).then(value => {
	console.log(222);
}).then(value => {
	console.log(333);
}).catch(reason => {
	console.warn(reason);
});

9、Promise、async、await执行顺序

javascript">async function async1(){
	console.log('async1 start')	//2  
    // 执行async2函数的 setTimeout
    await async2()
    setTimeout(function(){
        // 等上面执行完在执行
        console.log('setTimeout1')//8
	},0)
}		
async function async2(){
    setTimeout(function(){
    	console.log('setTimeout2')//7
    },0)
}
console.log('script start')//1    //执行同步代码
setTimeout(function(){
    // 最后执行setTimeout
    console.log('setTimeout3')//6
},0)
async1()  			//调用 
//执行先执行同步 输出2

// 调用
// 执行异步setTimeout
new Promise(function(r,j){
	console.log('Promise1')//3  //按照代码顺序
	r()
}).then(function(){
    // 等主线任务完成在执行
    console.log('Promise2')//5
})
console.log('script end')//4

10、Promise实例

javascript">console.log("start");

setTimeout(()=>{
	console.log("setTimeout");
},0);
    
new Promise((resolve,reject)=>{
	for(var i=0;i<5;i++){
    	console.log(i);
    }
    resolve() //修改promise状态为成功
}).then(()=>{
    console.log("promise回调函数");
})

console.log("end");
第一个宏任务队列
执行主线程上的代码
第二个宏任务
setTimeout
微任务队列
new Promise.then()
1、先执行主线程上的同步代码,输出start
2、遇到setTimeout将其加入到宏任务队列等待执行
3、遇到promise 立即执行,输出 01234
4、遇到promise的回调函数将其加入到微任务队列
5、执行主线程的同步代码,输出end
6、第一个宏任务队列执行完毕查看存在微任务队列,执行微任务队列中的任务,输出promise的回调函数
7、微任务执行完毕,执行下一个宏任务队列中的任务,输出setTimeout
输出:
start
0
1
2
3
4
end
promise回调函数
setTimeout

http://www.niftyadmin.cn/n/1004161.html

相关文章

【java】判断图中是否有环的简单实现

问题 Java 实现图的基本数据结构&#xff0c;并判断图中是否有环。 实现 GraphRelationPair 图中两个点的关系对实体类如下 import lombok.AllArgsConstructor; import lombok.Data;Data AllArgsConstructor /*** 图的关系对*/ public class GraphRelationPair {// 当前节点…

Leonard ai 画明代皇帝肖像

链接&#xff1a; https://app.leonardo.ai/ai-generations prompt&#xff1a; Highly detailed doodle illustration of a Chinese emperor centered, isometric, mural, doodle, composition, shape, pattern, vector art ready to print Negative Prompt&#xff1a; …

ST STM32H723ZGTx - NUCLEO-H723ZG DMAMUX_RequestGen例程重现/消化/改进

文章目录 ST STM32H723ZGTx - NUCLEO-H723ZG DMAMUX_RequestGen例程重现/消化/改进概述笔记问题的难点为了确定程序流程, 加入ITM将CubeMX升级到最新将CubeMX说明书翻一下CubeMX配置芯片功能实验工程主要代码.sct文件main.c中断实现文件 stm32h7xx_it.c.ioc补充END ST STM32H72…

Vim 使用学习记录(1)

前言 在使用编辑器的时候依然存在很多不方便&#xff0c;Vim使用上手成本很高&#xff0c;但还是得学着用&#xff0c;此系列用来记录学习使用的Vim基本命令和用法 参考链接 zhihu 参考链接 博客 vim基本模式 vim的基本模式分为&#xff1a; 命令模式&#xff08;Command Mo…

【Gradio】Could not create share link

Gradio是MIT的开源项目&#xff0c;用于构建机器学习和数据科学演示和 Web 应用&#xff0c;挺有意思的&#xff0c;感兴趣的同学可以去Gradio官网查看。 本地环境&#xff1a; - OS: Win 11 - Pyton: 3.10.11 - Gradio: 3.29.0 Gradio库的安装(Python 需要3.7 版本): - pip …

SpringBoot第10讲:开发中的常用注解

SpringBoot第10讲&#xff1a;开发中的常用注解 本文是SpringBoot第10讲&#xff0c;主要介绍一些SpringBoot中常用的注解 文章目录 SpringBoot第10讲&#xff1a;开发中的常用注解1、SpringBootApplication2、EnableAutoConfiguration2.1、商品中心的使用2.2、在订单的使用 3、…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

工具效果&#xff1a; 第一步&#xff0c;把psd图层转换为可编辑的节点树&#xff0c;并自动解析UI类型、自动绑定UI子元素&#xff1a; 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型)&#xff1a; 验证一键生成UI效果: 书接上…

济南中医风湿病医院受邀参加北坦街道“学习二十大 奋进新征程”主题党日活动

为学习贯彻党的二十大精神&#xff0c;中共天桥区北坦街道工作委员会于近日特组织开展“学习贯彻二十大精神 凝心聚力奋进新征程”联合主题党日活动&#xff0c;济南中医风湿病医院党支部预备党员卢雪梅同志受邀参加。 活动第一站&#xff0c;参观济南黄河文化展览馆。这是一部…