为什么用promise?
es6中的promise对象是为了解决异步代码的问题,以前我们在实现异步的时候,用的是回调,然而一旦回调嵌套的过深,非常影响浏览器的性能,而且用回调实现异步,让代码可读性变得很差,让人难以理解。于是在es6当中提出promise,方便异步代码的编写和理解。
promise.then / catch
举例: 加入两个异步函数,一个设置为0.5s后执行,一个1s后执行。如果我们只是单纯的调用他们,无论谁的调用在前面,都是时间小的先执行。当然我们可以使用回调来解决这个问题,就是把一个函数在另一个函数内部执行。
这里我们使用promise来解决。
function xq() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('老王相亲!');
resolve('成功')
},1000)
})
}
function marry() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('结婚大吉!')
resolve('结婚')
},500)
})
}
xq().then((res)=> {
console.log(res)
marry()
})
promise 接受两个函数作为参数,resolve 和 reject,resolve是指执行成功,reject指失败。如果promise后想要接.then或者.catch,就必须要有resolve或者reject的执行,resolve对应.then(),reject对应.catch(),resolve或reject的返回结果会作为下一层的.then或.catch()的参数。then 和 catch 接收一个回调函数,它的返回结果也是一个promise对象,也就是说,我们可以实现链式调用.then和.catch。
function xq() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('老王相亲!');
// resolve('成功')
reject('你太丑了')
},1000)
})
}
function marry() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log('结婚大吉!')
resolve('结婚')
},500)
})
}
xq().then((res)=> {
console.log(res)
marry()
}).catch((err) => {
console.log(err)
})
promise 还有很多其他的api,想要详细了解可以看阮一峰老师的es6.