欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

浅认识Promise

程序员文章站 2022-07-02 22:38:46
...

因为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(); //小程序

待续…