es6中的Promise对象

198 阅读3分钟

什么是Promise

Promise是js中的异步解决方案,在没有Promise之前也有异步编程,比如回调函数,事件,定时器。这些都可以做异步编程,而有了Promise之后,在js中异步编程将变得统一而规范。

Promise可以看做是一个代码盒子,在这个盒子里面的代码将会是异步执行的代码(也就可能是在未来才会有结果的的一个事件),从我们写代码的角度来看,Promise就是一个对象,这个对象可以获取里面异步操作的消息,然而Promise提供了统一的API, 各种异步操作,怎么获取状态...等等,都调用这个对象的API方法即可。

Promise的特点

Promise的状态不受外界影响,Promise对象代表异步操作,有三种状态: padding(进行中)、Resoleve(已完成)、Rejected(已失败)。 当Promise执行了后,状态就只有两种了,要么成功,要么失败。而这个“成功”和“失败”外界是没法改变的,只能他自己内部处理。

Promised的缺点

(1)无法取消Promise, 一旦新建就会立即执行,无法中途取消

(2)Promise内部抛出的错误,只能通过回调函数处理,并不会反应到到外部

(3)状态只有执行执行完成才能获取(成功或者失败),无法获取中间的执行过程状态。

基本用法

Promise就是一个构造函数,接收一个函数作为参数,这个函数有两个参数,resolve和reject

resolve 成功的回调

reject 失败的回调

获取成功的结果用then() 方法 , 接收一个回调函数,参数是成功的结果

获取失败的结果用catch()方法 , 接收一个回调函数,参数是错误的结果(通常是错误信息)

无论成功或者失败都会执行的finally()方法

var promise = new Promise((resolve,reject)=>{
	// code  在这里写需要异步操作的代码
	if(true){
		resolve('成功了')
	}else{
		reject('到这里就是失败了');
	}
})

// 以下返回的都是当前promise对象,所以就可以链式调用
promise.then(res=>{
	console.log(res) // 成功了
}).catch(err=>{
	console.log(err) // 到这里就是失败了
}).finally(()=>{
	console.log('我都执行')
})

其他方法

Promise.all()

执行一组Promise, 全部执行完才会到then方法里面,有一个执行失败了就到catch方法,

then()的的参数是全部执行成功的结果,顺序和传入的数组参数一致。

var p1 = new Promise((resolve,reject)=>{
	resolve('p1')
})

var p2 = new Promise((resolve,reject)=>{
	resolve('p2')
	// reject('no p2')
})

var p3 = new Promise((resolve,reject)=>{
	resolve('p3')
})

Promise.all([p1,p2,p3]).then(res=>{
	console.log(res)  // res就是对应 [p1,p2,p3] 返回的结果 ['p1', 'p2', 'p3']
}).catch(err=>{
	console.log(err) //只要有一个reject了,就会到这个catch里面来
})

Promise.race()

和all()使用方式相同,也是执行一组Promise, 但是结果不同,一组Promise中谁先返回,结果就是谁

var r1 = new Promise((resolve,reject)=>{
	setTimeout(()=>{ resolve('r1') },3000)
})

var r2 = new Promise((resolve,reject)=>{
	setTimeout(()=>{ resolve('r2') },2000)
})

var r3 = new Promise((resolve,reject)=>{
	setTimeout(()=>{ resolve('r3') },1000)
})

Promise.race([r1,r2,r3]).then(res=>{
	console.log(res)
}).catch((err)=>{
	console.log(err)
})

Promise.resolve()

返回一个成功状态的promise对象

Promise.reject()

返回一个失败状态的promise对象