最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 回调地狱(callback hell) 和 promise

    正文概述 掘金(pfzzz)   2020-12-12   728

    回调地狱(callback hell) 和 promise

    回调

    写了却不调用,给别人调用的函数就是回调 即回头调用一下这个函数

    function f1(){}
    function f2(fn){
      fn()
    }
    f2(f1)
    

    上述代码的 f1就是回调

    因为我只把它创建出来了,我没有调用它而是f2调用了它

    异步和回调的关系

    • 异步任务需要用到回调函数来通知结果
    • 但是回调函数不一定只用在异步任务里
    • 回调可以用到同步里 比如
    array.forEach(n=>console.log(n)) // 这个就是同步回调
    

    callback hell 回调地狱

    为什么会有回调地狱的出现呢? 我将以下面的例子来解释说明

    没有顺序的读取 a b c 三个文件

    const fs = require('fs')
    
    fs.readFile('./a.txt', 'utf8', function (err, data) {
        if (err) {
            // return console.log('读取错误');
    
            // 抛出异常
            // 1.阻止程序的执行  2. 把错误消息打印到控制台  
            throw err
        }
        console.log(data);
    })
    fs.readFile('./b.txt', 'utf8', function (err, data) {
        if (err) {
            // return console.log('读取错误');
    
            // 抛出异常
            // 1.阻止程序的执行  2. 把错误消息打印到控制台  
            throw err
        }
        console.log(data);
    })
    fs.readFile('./c.txt', 'utf8', function (err, data) {
        if (err) {
            // return console.log('读取错误');
    
            // 抛出异常
            // 1.阻止程序的执行  2. 把错误消息打印到控制台  
            throw err
        }
        console.log(data);
    })
    
    

    这里打印的data是没有顺序的,谁快谁就先执行。

    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello bbbb
    hello cccc
    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello cccc
    hello bbbb
    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello cccc
    hello bbbb
    

    如果想要有顺序的分别 读取 a b c 三个文件

    const fs = require('fs')
    
    fs.readFile('./a.txt', 'utf8', function (err, data) {
        if (err) {
            // return console.log('读取错误');
    
            // 抛出异常
            // 1.阻止程序的执行  2. 把错误消息打印到控制台  
            throw err
        }
        console.log(data);
        fs.readFile('./b.txt', 'utf8', function (err, data) {
            if (err) {
                // return console.log('读取错误');
    
                // 抛出异常
                // 1.阻止程序的执行  2. 把错误消息打印到控制台  
                throw err
            }
            console.log(data);
            fs.readFile('./c.txt', 'utf8', function (err, data) {
                if (err) {
                    // return console.log('读取错误');
    
                    // 抛出异常
                    // 1.阻止程序的执行  2. 把错误消息打印到控制台  
                    throw err
                }
                console.log(data);
            })
        })
    
    })
    

    我只需一层一层的嵌套即可,等读取a.txt完毕后再去执行b.txt,等读取b.txt完毕后再去执行c.txt

    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello bbbb
    hello cccc
    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello bbbb
    hello cccc
    PS F:\nodejs\Node_test> node .\13.回调地狱.js
    hello aaaa
    hello bbbb
    hello cccc
    

    Promise

    为什么需要用promise?

    我个人理解有三点:

    1. 在使用ajax调用成功和失败方法时,命名不够规范。
    2. 容易出现回调地狱
    3. 很难进行错误处理

    成功 和 失败 分别怎么调用

    • 如果成功, 会调用 resolve() 这个时候,我们后续的 .then() 会被回调
    • 如果失败, 会调用 reject() 这个时候,我们后续的 .catch() 会被调用
    new Promise((resolve, rejects) => {
      setTimeout(() => {
        // 成功时调用 resolve()
        resolve('hello world')
    
        // 失败时调用 reject
        // rejects('error message')
      }, 1000)
    }).then((data) => {
      console.log(data);
    }).catch((err) => {
      console.log(err);
    })
    

    起源地下载网 » 回调地狱(callback hell) 和 promise

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元