ES6: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异步调用实例

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执行顺序

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实例

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
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ES6Promise是一种用于处理异步操作的对象。Promise对象可以表示一个异步操作的最终完成(包括成功和失败)及结果值的表示。它可以解决传统回调函数的问题,使代码更具可读性和可维护性。Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。通过使用Promise对象,我们可以更好地控制和处理异步操作的结果。 ES6Promise相对于传统的回调函数具有以下优点: 1. 更好的代码结构和可读性:使用Promise可以使代码结构更清晰,减少了回调函数的层层嵌套。 2. 更好的错误处理:Promise可以通过catch方法捕获错误,并进行统一的错误处理,使错误处理更加简洁和方便。 3. 更好的异步流程控制:Promise可以通过then方法链式调用,实现更复杂的异步流程控制,避免了回调地狱的问题。 ES6Promise API包括以下方法: 1. Promise.resolve(value):返回一个解析后带有给定值的Promise对象。 2. Promise.reject(reason):返回一个带有拒绝原因的Promise对象。 3. Promise.all(iterable):返回一个Promise对象,该对象在iterable参数中的所有Promise对象都已解析或拒绝后解析。 4. Promise.race(iterable):返回一个Promise对象,该对象在iterable参数中的任何一个Promise对象解析或拒绝后解析。 5. Promise.prototype.then(onFulfilled, onRejected):添加解析和拒绝回调函数到Promise链中。 6. Promise.prototype.catch(onRejected):添加一个拒绝回调函数到Promise链中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端~初学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值