浅认识Promise

it2022-05-05  101

因为JS是单线程,所以导致所以网络操作,浏览器事件,都必须是异步的(要不然会一个线程走不下去会阻塞整个流程),异步执行可以用回调函数实现。 Promise: 1.基本阐述 2.它可以解决什么问题? 3.它的常用方法有哪些? 4.怎么用他来封装一个request?

/~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/ 1.1、有三种状态:pending(进行中),fulfilled(成功),rejected(失败)

变化:pending ——> fulfilled => resolved pending ——> rejected => rejected

1.2、用法:Promise对象是一个构造函数,用来生成Promise实例

const p = new Promise((resolve, reject) => { //TODO if(/*成功*/) { resolve(val) } else { reject(error) } }) p.then(val => { console.log(`success:${val}`) }, (error) => { // 这种写法不赞同,采用catch可以捕获then里面的错误 console.log(`success:${error}`) })

1.3、参数:resolve,reject 我们知道这二个参数是二个函数,当这二个函数带有参数时,被传递给回调函数即上面的:val和error。 当除正常值外也有传递另一个Promise对象,如下:

const p1 = new Promise((resolve, reject) => { // ... }) const p2 = new Promise((resolve, reject) => { resolve(p1) })

这里P1的状态传给了p2,P1决定了P2的状态。如果P1是pending(列如里面有定时器)状态P2的回调函数就会等P1的状态改变,如果是resolve或reject那么P2的回调就会立即执行。

1.4、执行顺序:

new Promise((resolve, reject) => { resolve(1); console.log(2); }).then(res => { console.log(res) }) // 2 // 1

这里的只要Promise函数一创建就会立即执行,而resolve和reject是在.then里面执行的,所以这里先打印2后打印1。但在开发过程中一般resolve和reject后面不会有后续操作了, 所有一般是:

return resolve(res); // 后面的不会执行 console.log(2);

1.5、promise方法then和catch: 这二个方法都是在Promise实例对象上的,也就是他们是挂在原型对象Promise.prototype上的。 我们知道成功调用then失败是走上面的error的,其实这个catch是error的别名,这个catch有二种情况会执行到这里面,第一个reject,还有一个是当then里面抛出异常时也会走这里的

const p = new Promise((resolve, reject) => { resolve(1) // throw new Error('状态已变更,我是捕获不到的'); // 注意如果状态已改变了在抛出异常已无效了 }) p.then(res => { console.log(res); throw new Error('我也错了') }).catch(err => { console.log(err) }) // 1 // Error: 我也错了

注:Promise里面的错误不会终止运行,会被自己吃掉错误,不会影响外面的代码运行

1.6、finally方法 这个方法是不管理Promise状态如何是resolve还是reject,都不管,都会执行finally有点类似于request里的complete方法,一般用于处理状态关闭,如:

wx.hideLoading(); //小程序

待续…


最新回复(0)