Es6 Promise基础用法

155 阅读1分钟

为什么用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()
})

8F6B(1W8JAP6R4QZ%J8U0T.png

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)
})

MM9~VDUP_K8@8SDR)5JEBLP.png

promise 还有很多其他的api,想要详细了解可以看阮一峰老师的es6.