最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 异步无处不在:回调函数(二)

    正文概述 掘金(勾崽)   2021-01-12   428

    上篇,我们聊了 JS 中的同步模式和异步模式。本篇,我们来唠唠回调函数

    异步代码的执行流程如下:

    异步无处不在:回调函数(二)

    通过上图,我们会看到,在整个代码的执行中,JS 本身的执行依然是单线程的,异步执行的最终结果,依然需要回到 JS 线程上进行处理。

    在 JS 中,异步的结果回到 JS 主线程所采用的是 “ 回调函数 ” 的形式。

    所谓的回调函数就是在 JS 主线程上声明一个函数,然后将函数作为参数传入异步调用线程,当异步执行结束后,调用这个函数,将结果以实参的形式传入函数的调用(也有可能不传参,但是函数调用一定会有)。

    上篇的代码中 setTimeout 就是一个异步方法,传入的第一个参数就是回调函数,这个函数的执行就是消息队列中的 “回调”。

    下面我们自己封装一个 ajax 请求,来进一步说明回调函数与异步的关系

    Ajax 的异步请求封装

    function myAjax(url,callback) {
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function () {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    // 成功的回调
                    callback(null,this.responseText)
                } else {
                    // 失败的回调
                    callback(new Error(),null);
                }
            }
        }
    
    ​    xhr.open('get', url)
        xhr.send();
    }
    

    上面的代码,封装了一个 myAjax 的函数,用于发送异步的 ajax 请求。

    函数调用时,代码实际是按照同步模式执行的。当执行到 xhr.send() 时,就会开启异步的网络请求,向指定的 url 地址发送。从建立网络连接到断开网络连接的整个过程是异步线程在执行的。

    换个说法就是 myAjax 函数执行到 xhr.send() 后,函数的调用执行就已经结束了。如果 myAjax 函数调用的后面有代码,则会继续执行,不会等待 ajax 的请求结果。

    但是,myAjax 函数调用结束后,ajax 的网络请求却依然在进行着。

    如果想要获取到 ajax 网络请求的结果,我们就需要在结果返回后,调用一个 JS 线程的函数,将结果以实参的形式传入:

    myAjax('./d1.json',function(err,data){
        console.log(data);
    })
    

    回调函数让我们轻松处理异步的结果。但是,如果代码是异步执行的,而逻辑是同步的,就会出现 “回调地狱”,举个栗子:

    代码 B 需要等待代码 A 执行结束才能执行,而代码 C 又需要等待代码 B,代码 D 又需要等待代码 C,而代码 A、B、C 都是异步执行的。

    // 回调函数 回调地狱
     myAjax('./d1.json',function(err,data){
        console.log(data);
        if(!err){
            myAjax('./d2.json',function(err,data){
                console.log(data);
                if(!err){
                    myAjax('./d3.json',function(){
                        console.log(data);
                    })
                }
            })
        }
    })
    

    没错,代码执行是异步的。但是异步的结果,是需要有强前后顺序的,著名的"回调地狱"就是这么诞生的。

    相对来说,代码逻辑是固定的,但是编码体验要差很多,尤其在后期维护的时候,层级嵌套太深,让人头皮发麻。

    如何让我们的代码不在地狱中受苦呢?

    下篇告诉你(ง •_•)ง。


    起源地下载网 » 异步无处不在:回调函数(二)

    常见问题FAQ

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

    发表评论

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

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

    联系作者

    请选择支付方式

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