Promise 作用
Promise意在让异步代码变得干净和直观,让异步代码变得井然有序。
Promise在设计上具有原子性,即只有三种状态:等待(Pending)、成功(Fulfilled)、失败(Rejected)。在调用支持Promise的异步方法时,逻辑变得非常简单,在大规模的软件工程开发中具有良好的健壮性。
(1)基本语法
创建Promise对象:
要想给一个函数赋予Promise能力,就要先创建一个Promise对象,并将其作为函数值返回。Promise对象要求传入一个函数,并带有resolve和reject参数。这是两个用于结束Promise等待的函数,对应的状态分别是成功和失败。
handleButton() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('延迟执行')
resolve({'code': '200'})
// reject({'error': '404'})
}, 2000);
}).then((result) => {
console.log('最后执行' + result.code)
}).catch((error) => {
console.log('执行失败' + error.error)
})
},
将新创建的Promise对象作为异步方法的返回值,所有的状态就可以使用它所提供的方法进行控制了。
进行异步操作:
创建了 Promise对象后,就可以进行异步操作,并通过resolve (value)和reject (reason)方法来控制Promise的原子状态。
resolve(value)方法控制的是当前Promise对象是否进入成功状态,一旦执行该方法并传入有且只有一个返回值,Promise便会从等待状态(Pending)进入成功状态(Fulfilled),Promise也不会再接收任何状态的变。
reject (reason)方法控制的是当前Promise对象是否进入失败阶段,与resolve方法相冋,一旦进入失败阶段就无法再改变。
其中在Promise的首层函数作用域中一旦出现throw语句,Promise对象便会直接进入失败状态,并以throw语句的抛出值作为错误值进行错误处理。
handleButton() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('延迟执行')
resolve('200')
//throw new Error('error') // 执行solve 方法,出现throw 语音,直接抛出异常,执行reject 方法
// reject('404')
}, 2000);
}).then((result) => {
console.log('最后执行' + result)
//throw new Error('error') // 执行solve 方法,出现throw 语音,直接抛出异常,执行reject 方法
}).catch((error) => {
console.log('错误执行' + error)
})
},
错误结果
延迟执行
最后执行200
错误执行Error: error
但是相对的return语句并不会使Promise对象进入成功状态,而会使Promise停留在等待状态。所以在Promise对象的执行器(executor)内需要谨慎使用return语句来控制代码流程。
(2)高级使用方法
Promise.all
Promise.all([f1, f2, f3])用于将多个promise实例,包装成一个新的Promise实例,返回的实例就是普通的promise
它接收一个数组作为参数
数组里可以是Promise对象,也可以是别的值,只有Promise会等待状态改变
当所有的子Promise都完成,该Promise完成,返回值是全部值得数组
有任何一个失败,该Promise失败,返回值是第一个失败的子Promise结果
func1() {
console.log('go func1')
return new Promise((resolve, reject) => {
setTimeout(() => {
// reject('func1')
resolve('func1')
}, 5000)
})
},
func2() {
console.log('go func2')
return new Promise((resolve, reject) => {
setTimeout(() => {
// resolve('func2')
reject('func2')
}, 3000)
})
},
func3() {
console.log('go func3')
return new Promise((resolve, reject) => {
setTimeout(() => {
// reject('func3')
resolve('func3')
}, 1000)
})
},
handleAdd() {
const promiseArray = [this.func1(), this.func2(), this.func3()]
Promise.all(promiseArray)
.then(res => {
console.log('success:' + res)
})
.catch(error => {
console.log('error:' + error)
})
},
执行结果
go func1
go func2
go func3
success:func1,func2,func3
如果func2() 方法执行reject ,执行结果如下:
go func1
go func2
go func3
error:func2
Promise.race()
顾名思义,Promse.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
handleAdd() {
const promiseArray = [this.func1(), this.func2(), this.func3()]
Promise.race(promiseArray)
.then(res => {
console.log('success:' + res)
})
.catch(error => {
console.log('error:' + error)
})
}
执行结果
go func1
go func2
go func3
success:func3
网友评论