Promise与回调地狱

在开发js过程中,异步操作不能保证执行顺序是我们想象的那样,所以,就出现了“回调地狱”。
所谓的回调地狱就是回调里套回调,一层套一层,可读性极差,在远古时期,使用jQuery发送ajax请求的代码类似于如下,
拿到1的数据请求2,拿到2的数据请求3

// 1
$.ajax({
    url: '/api',
    data:{ type:1, }
    success: function(res) {
        console.log('获取数据1:'+res)
        // 2
        $.ajax({
            url: '/api',
            data:{ type:res.data, }
            success: function(res) {
                console.log('获取数据2:'+res)
                // 3
                $.ajax({
                    url: '/api',
                    data:{ type:res.data, }
                    success: function(res) {
                        console.log('获取数据3:'+res)
                    }
                })
            }
        })
    }
})

使用Promise之后

function getData(url, data = {}) {
    return new Promise((resolve, reject) => {
        $.ajax({
            url,
            data,
            success: resolve
            error: reject
        })
    })
}
getData('/api')
    .then(res => {
    return getData('/api', { id: res.data }))
})
.then(res => {
    return getData('/api', { id: res.data })
})
.then(res => {
	console.log(res)
})

每一个then的参数函数内我们又调用了个getData函数,即返回了一个Promise对象,这也是Promise的链式调用的关键所在。

缺陷
1、Promise函数改变了之前回调地狱的写法,但是在根本上还是函数套函数,看起来不是那么的美观
2、Promise一经执行,无法中断,除非抛出异常
3、在Promise外部无法通过try/catch的方式捕获Promise内部抛出的异常。

发布了76 篇原创文章 · 获赞 144 · 访问量 3035

猜你喜欢

转载自blog.csdn.net/qq_40745143/article/details/103902941