白也blog - 2022年4月20日
type: channel
link: https://www.baiyeovo.cn/index.php/2022/04/20/
description: 总有人间一两风,填我十万八千梦
items: 这一次,彻底弄懂Promise!

这一次,彻底弄懂Promise!
type: item
date: 2022-04-20T19:10:00+08:00
description: 什么是Promise它是一个ES6提出一个新语法，用来优化异步代码的写法。Promise的基本使用Promise是承诺的意思，es6中提出一个新api。用来优化异步代码。它的经典使用方式如下:var p1 = new Promise(function(resolve,reject){ //异步操作 resolve(obj1) 或者 reject(obj2) }); p1.then(function(rs){ // 如果p1的状态是resolved，则then中的函数 //会执行，且obj1的值会传给rs }).catch(function(rs){ // 如果p1的状态是reject，则catch中的函数 // 会执行，且obj2的值会传给rs }).finally(function(){ // 一定会执行的函数 })构造器// const obj = new Object() // const arr = new Array() const p1 = new Promise(function(resolve,reject){ // 执行异步代码 // 调用resolve,或者reject }); console.dir(p1)要点:● 构造器必须要给定一个参数，如果不给就是会报错。例如，new Promise() 报错的信息是： Promise resolver undefined is not a function● 构造器的实参是一个函数，这个函数的特殊之处在于它有两个形参(resolve,reject)，这两个形参也是函数。在格式上，也可以采用箭头函数来改写。例如：var p1 = new Promise((resolve,reject)=>{})。● 在函数体的内部， 一般会执行异步代码，然后根据情况来调用resolve()或者是reject() 。调用resolve或者是reject后会产生什么样的后果，在后面小节介绍。 当然了，再次强调一下resolve和reject只是形参名，可以改写成其它的。三种状态和值一个Promise对象的状态可能是如下三种之一：pending,resolved,rejected.初始态pendingpending。它的意思是 "待定的，将发生的"，相当于是一个初始状态。 创建Promise对象时，且没有调用resolve或者是reject方法，相当于是初始状态。这个初始状态会随着你调用resolve，或者是reject函数而切换到另一种状态。var p = new Promise((resolve,rejectok,err)=>{ console.info('发呆.....' )}) console.dir(p)成功态resolved也有叫fulfilled的。resolved。表示解决了，就是说这个承诺实现了。 要实现从pending到resolved的转变，需要在 创建Promise对象时，在函数体中调用了resolve方法(即第一个参数)。var p = new Promise((resolve,reject)=>{ resolved();}) console.dir(p)注意注意，上面的resolve和reject仅是形参名而已。失败态rejectedrejected。拒绝，失败。表示这个承诺没有做到，失败了。要实现从pending到rejected的转换，只需要在创建Promise对象时，调用reject函数。var p = new Promise((resolve,reject)=>{ reject()} ) console.dir(p)三种状态小结1.状态是可转化。 最初创建promise对象时，默认状态是pending，如果在函数体内部调用了第一个参数对应的函数，则状态变成了resolved；如果调用了第二个参数对应的函数，则状态变成了rejected pending ----- resolve() --> resolved; pending ----- reject() --> rejected; 2.状态转换是不可逆的。 一旦从pending ---> resolved（或者是rejected），就不可能再回到pending，也不能由resolved变成rejected。promise的值一个promise对象除了状态之外，还有promiseValue。在构造器中，这个值在调用resolve和reject方法时传入例如var p = new Promise( (resolve,reject) => { resolve(123); } ); // 此时，prommise对象p的状态是 resolved，值是123。 console.dir(p)var p = new …