概述
Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件。
ES6统一了用法,并原生提供了Promise对象。作为对象,Promise有一下两个特点:
- 对象的状态不受外界影响。
- 一旦状态改变了就不会在变,也就是说任何时候Promise都只有一种状态。
Promise与callback相比可以避免多个异步嵌套,降低代码复杂性。
Promise 的状态
任务状态 |
结果 |
等待态(pending) |
挂起:任务在初始状态,未完成 |
执行态(fulfilled/resolved) |
已解决:任务结束,成功完成 |
拒绝态(rejected) |
被拒绝:任务结束,失败了 |
let p = new Promise((resolve, reject) => {
return; //Promise {<pending>}
//resolve('成功'); //Promise {<fulfilled>: '正确'}
//reject('失败'); //Promise {<rejected>: '错误'}
})
Promise 原型
//promise 原型
console.log(Promise.prototype);
Promise构造函数的原型上的then
, catch
, finally
方法可以进行任务结束后的下一步操作,每个Promise实例也可以使用。
then:然后,任务成功结束的后续操作在then方法中完成。
catch:捕获,任务失败结束的后续操作在catch方法中完成。
(注意:Promise中出现代码写错误,程序内部会throw Error,程序崩溃,但是这个catch也有捕获的能力,最终出现代码错也不会崩溃。)
finally
:方法用于指定不管 Promise 对象最后状态如何,都会执行的操作
(finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected
。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。)
Promise的执行特点:
1:该函数是不是回调函数? 是
2:该函数是同步执行还是异步执行? 同步执行
3:话说promise实例对象是为了解决异步回调地狱问题?究竟哪里的程序是异步程序呢?then 的回调函数异步执行
小问题?
为什么setTimeOut 回调执行,比 then 的回调慢?
then回调是微任务。setTimeOut是宏任务。在忽略Script情况下先微任务后宏任务。
静态方法:
1:Promise.resolve()
作用:创建一个 已完成状态的promise实例
返回值:promise实例
实参: 作用: 给[[PromiseReuslt]] 赋值
2: Promise.reject()
作用:创建一个已拒绝状态的promise 实例
返回值:promise实例
实参: 赋值错误对象
3: Promise.all()
4: Promise.race()
原型api:
1:then 2:catch 3:finally
总结:
1: promise 实例对象创建有几种方式
1.1 new Promise
1.2 then的返回值
1.3 catch 的返回值
1.4 finally 的返回值
1.5 async 函数的返回值
2: 更改promise状态有什么方式
resove() fulfilled 已接受
reject() rejected 已拒绝
3: [[PromiseResult]] 赋值有几种方式
2.1 resolve reject的实参
2.2 then 的return
2.3 async 的return
注意:[[PromiseResult]] 赋值永远不可能是promise实例对象
当[[PromiseResult]] 赋值为 prosmie实例时候。它会赋值该promise实例的.[[PromiseResult]]
4: [[PromiseResult]] 取值有哪些方式
4.1 then的回参
4.2 await 返回值