浅认识Promise
因为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(); //小程序
待续…