• WebAPI:XMLHttpRequest是怎样实现的?


    回调函数:

    将一个函数作为参数传递给另外一个函数,那作为参数的这个函数就是回调函数

    let callback = function(){   
    	console.log('i am do homework')
    }
    function doWork(cb) {    
    	console.log('start do work')    
    	cb()    
    	console.log('end do work')
    }
    doWork(callback)
    
    
    同步回调:

    回调函数callback是在主函数doWork返回之前执行的。如上面代码。

    异步回调 :

    回调函数callback没有在主函数doWork内部被调用,把这种回调函数在主函数外部执行的过程称为异步回调

    // 通过setTimeout函数让callback在doWork函数执行结束后并延迟1s执行
    let callback = function() {
        console.log("i an do homework")
    }
    function doWork(cb) {
        console.log("start do work")
        setTImeout(cb, 1000)
        console.log("end do work")
    }
    doWork(callback)
    
    同步回调和异步回调的区别(通过消息循环的视角):

    消息队列和主线程循环机制保证了页面有条不紊地运行

    • 同步回调是在当前主函数的上下文中执行回调函数
    • 异步回调是指回调函数在主函数之外执行。一般有两种方式:
      • 把异步函数做成一个任务,添加到消息队列尾部
      • 把异步函数添加到微任务队列中,这样就可以在当前任务的末尾处执行微任务了。
    XMLHTTPRequest运行机制(通过循环系统的视角):

    第一步:创建XMLHTTPRequest对象

    第二步:为xhr对象注册回调函数

    第三步:配置基础的请求信息

    第四步:发起请求

    XMLHTTPRequest使用过程中的“坑”
    • 跨域问题
    • HTTPS混合内容的问题

    对比上一篇,setTimeout直接将延迟任务添加到延迟队列中,而XMLHttpRequest 发起请求,是由浏览器的其他进程或者线程去执行,然后再将执行结果利用 IPC 的方式通知渲染进程,之后渲染进程再将对应的消息添加到消息队列中

  • 相关阅读:
    代码review之 isInfoEnable()
    sdk、jdk、jre、jvm、jdt、cdt分别都是什么东西
    思考总结: 决胜21点 开篇 概率问题
    Java多线程开发系列之四:玩转多线程(线程的控制2)
    Java多线程开发系列之四:玩转多线程(线程的控制1)
    Java多线程开发系列之三:线程这一辈子(线程的生命周期)
    Java多线程开发系列之二:如何创建多线程
    [系列] Gin框架
    [系列] Gin框架
    [系列] Gin 框架
  • 原文地址:https://www.cnblogs.com/zpsakura/p/13890167.html
Copyright © 2020-2023  润新知