Promise解决回调地狱问题

什么是Promise

  • PromiseES6 引入的异步编程的新解决方案。语法上 Promise 是一个构造函数, 用来封装异步操作并可以获取其成功或失败的结果。

什么是回调地狱

  • 所谓回调地狱就是在回调函数里面不断的嵌套回调函数,这样就会导致代码不断缩进,可读性就会变得非常的差。
  • 比如我要执行1秒打印一个人的姓名:
    image

这里我们可以使用Promise来解决回调地狱的问题

  • 因为Promise存在一种链式调用
  • 我们可以调用Promise中的then方法构成链式调用,代码如下:
    const p = new Promise((reslove , reject) =>{
        setTimeout(function(){
            var s = '老一';
            reslove(s);
        } , 1000)
    })

    p.then(function(value){
        console.log(value);
        return new Promise((reslove , reject) =>{
            setTimeout(function(){
                var s = '老二';
                reslove(s);
            } , 1000)
        })
    }).then(function(value){
        console.log(value);
        return new Promise((reslove , reject) =>{
            setTimeout(function(){
                var s = '老三';
                reslove(s);
            } , 1000)
        });
    }).then(function(value){
        console.log(value);
        return new Promise((reslove , reject) =>{
            setTimeout(function(){
                var s = '老四';
                reslove(s);
            } , 1000)
        });
    }).then(function(value){
        console.log(value);
        return new Promise((reslove , reject) =>{
            setTimeout(function(){
                var s = '老五';
                reslove(s);
            } , 1000)
        });
    }).then(function(value){
        console.log(value);
        return new Promise((reslove , reject) =>{
            setTimeout(function(){
                var s = '老六';
                reslove(s);
            } , 1000)
        });
    }).then(function(value){
        console.log(value);
    })

运行结果如下:

image

输出结果是一致的,但是解决了回调地狱的问题

原理刨析:(链式调用的原理)

  • 调用 then 方法 then方法的返回结果是 Promise 对象, 对象状态由回调函数的执行结果决定
    • 1).非 promise 类型的属性, 状态为成功或者失败, 返回值就是return后面跟着的值
    • 2).是 promise 类型的属性, 状态为成功或者失败, 返回值就是return后面跟着的新的promise对象的reslove()或者reject()
  • 在我看来,之所以Promise能够解决回调地狱的问题主要归功于 then 方法,then方法里面有一个return属性,而这个return属性当返回的是一个Promise对象时,那么如果后面还有嵌套的.then的话,返回的Promise对象就直接对接后面的.then方法,相当于上层Promise对象返回的新Promise对象就继续对接后面的.then方法,以此类推来解决回调地狱。