JS Promise

280 阅读3分钟

这篇文章记录一下自己学习promise的心得,如果有不对的地方,欢迎各位指出!!

基础用法

学过promise,应该都了解到,这是js实现异步的一种方式,主要用于解决回调地狱的问题的,那么什么是回调地狱呢?

当我们在进行接口请求时,如果有碰到这么一种情况,请求完接口a,利用接口a的结果去请求接口b接口,再用接口b的结果去请求接口c ......

$.ajax({
    url: '/a',
    success: function(resA) {
        $.ajax({
            url: '/b',
            data: {a: resA},
            success: function(resB){
                // ......
            }
        })    }
})

这个时候的回调函数是一层嵌套一层的,这就回调地狱的其中一种情况。这个时候的代码的可读性变得很差,所以我们可以用promise进行优化。

const a = function() {
    new Promise((res, rej) => {
        $.ajax({
            url: '/a',
            success(data) {
                res(data)        
            }
        })
    })
}

const b = function(dataA){
    return new Promise((res, rej) => {
        $.ajax({
            url: '/b',
            data: {a: dataA},
            success(data) {
                res(data)        
            }
        })    })
}

a().then(data => {
    return b(data)
}).then(data => {
    // ......
})

当我们把代码改为promise的写法时,看起来就方便很多了。

promise.all

记得早些时间面试的时候,有个面试官问我:“如何用promise实现图片按顺序加载?”,当时的我对于promise.all 这个方法并不是很熟悉,所以没有答上来。

all 方法的意思是,等待所有的promise程序都返回结果之后执行后续的程序,代码表现为:

let p1 = new Promise((resolve, reject) => {  
    resolve('成功了')
})

let p2 = new Promise((resolve, reject) => {  
    resolve('success')
})

let p3 = Promse.reject('失败')

Promise.all([p1, p2]).then((result) => {  
    console.log(result)                
    //['成功了', 'success']
}).catch((error) => {  
    console.log(error)
})

Promise.all([p1,p3,p2]).then((result) => {  
    console.log(result)
}).catch((error) => {  
    console.log(error)      
    // 失败了,打出 '失败'
})

上面的程序中一共有三个promise为p1、p2、p3,其中p1、p2是执行成功的,p3是失败的。

当我们用 all 方法监听 p1、p2时,因为监听的所有的promise都是成功的,所以程序进入then函数中,接收的参数result为一个数组,数组的每一项,是对应的监听顺序的每一项返回的参数。

这时候回到‘面试官’的问题,假设我们有10张图片,虽然每张图片加载的时间不同,但是我们可以在所有的图片加载完成之后,再按照顺序渲染到页面中,以实现按顺序加载图片。

而当我们用 all 方法监听 p1、p2、p3时,由于p3的执行失败了,所以程序就进入了catch中了,这个error接收的是失败的程序返回的值。

promise.race

let p1 = new Promise((resolve, reject) => {  
    setTimeout(() => {    
        resolve('success')  
    },1000)
})

let p2 = new Promise((resolve, reject) => {  
    setTimeout(() => {    
        reject('failed')  
    }, 500)
})

Promise.race([p1, p2]).then((result) => {  
    console.log(result)
}).catch((error) => {  
    console.log(error)  
    // 打出的是 'failed'
})

race方法说的是,当程序中的任意一项执行完成后,执行后续的then或者catch。

示例中p2的程序是0.5s执行完成的,所以程序进入的catch函数。

当两个程序都是成功的时候,哪个promise先执行完成,then就接收到谁的参数执行后面的内容了,后面的promise执行完成就不会再触发then函数了

感谢各位观看!!!

求赞!!!