回调地狱

  • A+
所属分类:js vue 前端

什么是地狱回调?解决回调地狱的两种方法

地狱回调概念:回调函数套回调函数的情况就叫做回调地狱,

    //地狱回调

    setTimeout(function () {  //第一层

        console.log('武林要以和为贵');

        setTimeout(function () {  //第二程

            console.log('要讲武德');

            setTimeout(function () {   //第三层

                console.log('不要搞窝里斗');

            }, 1000)

        }, 2000)

    }, 3000)

promise解决方式

    // promise解决方式

    function fn(str) {

        var p = new Promise(function (resolve, reject) {

            //处理异步任务

            var flag = true;

            setTimeout(function () {

                if (flag) {

                    resolve(str)

                }

                else {

                    reject('操作失败')

                }

            })

        })

        return p;

    }

 

    fn('武林要以和为贵')

        .then((data) => {

            console.log(data);

            return fn('要讲武德');

        })

        .then((data) => {

            console.log(data);

            return fn('不要搞窝里斗')

        })

        .then((data) => {

            console.log(data);

        })

        .catch((data) => {

            console.log(data);

        })

 async/await解决方式

    

    //封装一个返回promise的异步任务

    function fn(str) {

        var p = new Promise(function (resolve, reject) {

            var flag = true;

            setTimeout(function () {

                if (flag) {

                    resolve(str)

                } else {

                    reject('处理失败')

                }

            })

        })

        return p;

    }

 

    //封装一个执行上述异步任务的async函数

    async function test() {

        var res1 = await fn('武林要以和为贵');  //await直接拿到fn()返回的promise的数据,并且赋值给res

        var res2 = await fn('要讲武德');

        var res3 = await fn('不要搞窝里斗');

        console.log(res1, res2, res3);

    }

    //执行函数

    test();

————————————————

先来看一个小例子

var fs = require('fs')

fs.readFile('./src/a.txt', 'utf-8', function(err, data) {

    if (err) {

        throw err

    }

    console.log(data)

})

fs.readFile('./src/b.txt', 'utf-8', function(err, data) {

    if (err) {

        throw err

    }

    console.log(data)

})

fs.readFile('./src/c.txt', 'utf-8', function(err, data) {

    if (err) {

        throw err

    }

    console.log(data)

})

执行结果

说明

在里面依次读取了三个文件,如果都是从上往下依次执行,那么应该都是先a后b在c,但是因为读取文件是异步操作,执行时是不会等待的,所以全看谁先读完,因此导致第三次结果改变。

使用回调解决上述问题

var fs = require('fs')

fs.readFile('./src/a.txt', 'utf-8', function(err, data) {

    if (err) {

        throw err

    }

    console.log(data)

    fs.readFile('./src/b.txt', 'utf-8', function(err, data) {

        if (err) {

            throw err

        }

        console.log(data)

        fs.readFile('./src/c.txt', 'utf-8', function(err, data) {

            if (err) {

                throw err

            }

            console.log(data)

        })

    })

})

执行结果

说明

完全一致,但是代码太过丑陋不方便维护

什么是回调地狱

就是上面那种,一个异步请求套着一个异步请求,一个异步请求依赖于另一个的执行结果,使用回调的方式相互嵌套。

这会导致代码很丑陋,不方便后期维护

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: