怎么实现XMLHttpRequest

    消息队列主线程循环机制保证了页面有条不紊地运行。
    异步回调是指回调函数在主函数之外执行,一般有两种方式:
    第一种是把异步函数做成一个任务,添加到信息队列尾部
    第二种是把异步函数添加到微任务队列中,这样就可以在当前任务的末尾处执行微任务了。

XMLHttpRequest 运作机制


 function GetWebData(URL){
    /**
     * 1:新建XMLHttpRequest请求对象
     */
    let xhr = new XMLHttpRequest()

    /**
     * 2:注册相关事件回调处理函数 
     */
    xhr.onreadystatechange = function () {
        switch(xhr.readyState){
          case 0: //请求未初始化
            console.log("请求未初始化")
            break;
          case 1://OPENED
            console.log("OPENED")
            break;
          case 2://HEADERS_RECEIVED
            console.log("HEADERS_RECEIVED")
            break;
          case 3://LOADING  
            console.log("LOADING")
            break;
          case 4://DONE
            if(this.status == 200||this.status == 304){
                console.log(this.responseText);
                }
            console.log("DONE")
            break;
        }
    }

    xhr.ontimeout = function(e) { console.log('ontimeout') }
    xhr.onerror = function(e) { console.log('onerror') }

    /**
     * 3:打开请求
     */
    xhr.open('Get', URL, true);//创建一个Get请求,采用异步


    /**
     * 4:配置参数
     */
    xhr.timeout = 3000 //设置xhr请求的超时时间
    xhr.responseType = "text" //设置响应返回的数据格式
    xhr.setRequestHeader("X_TEST","time.geekbang")

    /**
     * 5:发送请求
     */
    xhr.send();
}

第一步:创建 XMLHttpRequest 对象。

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

    因为网络请求比较耗时,所以要注册回调函数,这样后台任务执行完成之后就会通过调用回调函数来告诉其执行结果.XMLHttpRequest 的回调函数主要有下面几种:
    ontimeout,用来监控超时请求,如果后台请求超时了,该函数会被调用;
    onerror,用来监控出错信息,如果后台请求出错了,该函数会被调用;
    onreadystatechange,用来监控后台请求过程中的状态,比如可以监控到 HTTP 头加载完成的消息、HTTP 响应体消息以及数据加载完成的消息等。

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

第四步:发起请求。

    一切准备就绪之后,就可以调用xhr.send来发起网络请求了。渲染进程会将请求发送给网络进程,然后网络进程负责资源的下载,等网络进程接收到数据之后,就会利用 IPC 来通知渲染进程;渲染进程接收到消息之后,会将 xhr 的回调函数封装成任务并添加到消息队列中,等主线程循环系统执行到该任务的时候,就会根据相关的状态来调用对应的回调函数。
    如果网络请求出错了,就会执行 xhr.onerror;如果超时了,就会执行 xhr.ontimeout;如果是正常的数据接收,就会执行 onreadystatechange 来反馈相应的状态。

    在跨域的时候,其实跨域的请求是发送出去了,服务器也接收到了并响应了,而是在返回的时候被浏览器“拦截在门外”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤利用XMLHttpRequest实现文件上传: 1. 创建XMLHttpRequest对象: ``` var xhr = new XMLHttpRequest(); ``` 2. 创建FormData对象,将文件添加到FormData对象中: ``` var formData = new FormData(); formData.append('file', file); ``` 其中,'file'为文件对应的字段名,file为文件对象。 3. 设置请求参数,包括请求方法、请求URL、是否异步等: ``` xhr.open('POST', url, true); ``` 其中,url为上传文件的地址。 4. 设置请求头部,指定上传文件的Content-Type: ``` xhr.setRequestHeader('Content-Type', 'multipart/form-data'); ``` 5. 发送请求,将FormData对象作为参数: ``` xhr.send(formData); ``` 6. 监听上传进度,可通过onprogress事件获取上传进度: ``` xhr.upload.onprogress = function(event) { var percent = Math.floor(event.loaded / event.total * 100); console.log('Upload progress: ' + percent + '%'); }; ``` 7. 监听上传完成事件,可通过onload事件获取上传结果: ``` xhr.onload = function() { if (xhr.status === 200) { console.log('Upload success'); } else { console.error('Upload error'); } }; ``` 完整代码示例: ``` var xhr = new XMLHttpRequest(); var formData = new FormData(); formData.append('file', file); xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'multipart/form-data'); xhr.upload.onprogress = function(event) { var percent = Math.floor(event.loaded / event.total * 100); console.log('Upload progress: ' + percent + '%'); }; xhr.onload = function() { if (xhr.status === 200) { console.log('Upload success'); } else { console.error('Upload error'); } }; xhr.send(formData); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值