html5 fetch API 的原理

3 篇文章 0 订阅
2 篇文章 0 订阅

1、说明
fetch是基于原生的XMLHttpRequest对象来实现数据请求的。

同时,fetch也是基于Promise实现链式调用的。

那么,实现fetch的本质:就是实现ajax的封装以及Promise的实现。

2、ajax的封装
在原生的api中,XMLHttpRequest对象是封装ajax的核心。

其最简单的封装步骤如下:

function ajax(url,suc,fail) {
  var xhr = new XMLHttpRequest();
    xhr.open('GET',url, true);
    xhr.onreadystatechange = function () {
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                suc(xhr.responseText)
            } else {
                console.log(err);
                fail(xhr.responseText);
            }
        }
    };
    xhr.send(null);
}

这个封装的核心就是这么四步:
实例化xhr对象;
open方法;
send方法;
onreadyState监听函数;

3、Promise的实现原理
根据Promise的api。我们知道它拥有then方法、catch方法。

并且Promise接受一个参数,这个参数是一个函数,而这个函数又接受两个参数,分别是resolve和reject。

Promise的实现中,我们的核心其实要找到resolve和then方法的对应桥梁,reject和catch方法的对应桥梁,把他们的桥梁架起来,这个Promise就实现了。

function Promise(fn) {
    this.resolveFn = null;
    this.rejectFn = null;
    var _this = this;
    function resolve(data) {
        var f = _this.resolveFn;
        f(data);
    }
    function reject(err) {
        var f = this.rejectFn;
        f(err);
    }
    fn(resolve,reject);
}

Promise.prototype.then = function (f) {
    this.resolveFn = f;
    return this;
};
Promise.prototype.catch = function (f) {
    this.rejectFn = f;
    return this;
};

这里面的对应是这样的:核心就是this.resolveFn,通过这个架起来resolve和then方法之间的桥梁。

4、结合Promise和ajax实现fetch
有了Promise,有了ajax封装函数,那fetch的实现就很简单了。

function fetch(url) {
    console.log('fetch start')
    return new Promise(function (resolve,reject) {
        ajax(url,function (res) {
            resolve(res);
        },function (err) {
            console.log(err);
            reject(err);
        })
    })
}

5、完整的示例代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>fetch示例</title>
    <script src="./fetch.js"></script>

</head>
<body>

</body>
<script>
    /**
     * Created by mapbar_front on 2017/11/28.
     */
    function Promise(fn) {
        this.resolveFn = null;
        this.rejectFn = null;
        var _this = this;
        function resolve(data) {
            var f = _this.resolveFn;
            f(data);
        }
        function reject(err) {
            var f = this.rejectFn;
            f(err);
        }
        fn(resolve,reject);
    }

    Promise.prototype.then = function (f) {
        this.resolveFn = f;
        return this;
    };
    Promise.prototype.catch = function (f) {
        this.rejectFn = f;
        return this;
    };


    function ajax(url,suc,fail) {
        var xhr = new XMLHttpRequest();
        xhr.open('GET',url, true);
        xhr.onreadystatechange = function () {
            if(xhr.readyState == 4){
                if(xhr.status == 200){
                    suc(xhr.responseText)
                } else {
                    console.log(err);
                    fail(xhr.responseText);
                }
            }
        };
        xhr.send(null);
    }

    function fetch(url) {
        console.log('fetch start')
        return new Promise(function (resolve,reject) {
            ajax(url,function (res) {
                resolve(res);
            },function (err) {
                console.log(err);
                reject(err);
            })
        })
    }
    fetch('http://datainfo.duapp.com/shopdata/getclass.php').then(function (res) {
        console.log(JSON.parse(res));
    }).catch (function (err) {
        console.log(err);
    })
</script>
</html>

6、最终效果图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 作为一名前端高级工程师,需要掌握很多的原理,以下是其中一些: 1. HTML、CSS、JavaScript原理:掌握浏览器的渲染机制、文档对象模型(DOM)和浏览器对象模型(BOM),了解HTML、CSS、JavaScript的工作原理,以及如何使用它们来构建 Web 应用程序。 2. 数据结构和算法:了解基本的数据结构(如栈、队列、链表、散列表、树和图)和算法(如排序、搜索和遍历),以及如何在 Web 应用程序中应用它们。 3. 网络协议和通信原理:了解 HTTP 协议、TCP/IP 协议、DNS 解析、网络拓扑等概念,掌握网络通信的基本原理和常见的网络问题排查方法。 4. 性能优化:了解前端性能优化的各种技术手段,如减少 HTTP 请求、使用浏览器缓存、代码压缩、图片优化、代码分割等等。 5. 安全性:了解 Web 安全漏洞,如跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、点击劫持等,掌握预防和解决这些安全漏洞的技术手段。 6. 跨平台开发:了解移动端开发、桌面端开发、PWA、H5 等前端跨平台开发技术的原理和实践。 7. 前端框架和工具原理:了解流行的前端框架和工具的原理和实现方式,如 React、Vue、Angular、Webpack、Babel 等。 8. 设计模式和架构:了解常见的前端设计模式,如 MVC、MVVM、Flux、Redux 等,以及如何设计可维护、可扩展的前端应用程序架构。 除此之外,还有一些其他的原理也很重要,如浏览器的事件循环机制、异步编程的原理前端测试技术等等。总之,作为一名前端高级工程师,需要不断学习和掌握新的技术和原理,以保持自己在前端领域的竞争力。 ### 回答2: 作为前端高级工程师,需要掌握以下原理: 1. HTML/CSS 原理:熟悉 HTML 标记语言的结构和语义化,了解浏览器渲染机制,掌握 CSS 的盒模型、布局、样式优先级等基本概念。 2. JavaScript 原理:深入了解 JavaScript 语言的特性、运行机制、原型链、作用域链等,掌握面向对象编程的思想,熟悉异步编程、闭包、事件机制、跨域请求等。 3. 浏览器原理:理解浏览器工作原理,包括 HTTP 请求、响应、缓存、DOM 解析、渲染和构建页面的过程,了解浏览器的兼容性和性能优化策略。 4. 前端框架原理:熟悉常见的前端框架(如React、Vue等)的设计原理和核心概念,了解虚拟DOM、数据绑定、组件化开发的思想,能够根据业务需求选择和优化框架。 5. 数据结构和算法:了解常用的数据结构(如数组、链表、树等)和算法(如排序、查找、动态规划等),能够根据实际情况选择和实现高效的数据结构和算法。 6. 性能优化原理:熟悉常见的性能优化策略,包括减少HTTP请求、异步加载、合并和压缩代码、图片优化、缓存策略、渲染性能优化等方面。 7. 网络安全原理:了解常见的网络安全攻击方式(如XSS、CSRF等),以及相应的防范措施,能够编写安全的前端代码,保护用户隐私和数据安全。 8. 工程化原理:理解前端工程化的概念和流程,掌握常见的构建工具、模块化开发、依赖管理、自动化测试等,能够搭建稳定、高效的前端开发环境。 以上是前端高级工程师需要掌握的一些基本原理,通过深入理解和实践这些原理,能够提升开发效率、优化用户体验,以及解决复杂的技术问题。 ### 回答3: 作为一名前端高级工程师,需要掌握以下原理: 1. HTML和CSS原理:理解HTML标记语言和CSS样式表的基本语法和结构,熟悉各种标签和属性的使用,能够实现网页的布局和样式设计。 2. JavaScript原理:熟悉JavaScript的核心概念,掌握变量、函数、对象等基础知识,理解事件驱动编程、异步编程和闭包等概念,能够编写高质量的JavaScript代码。 3. 浏览器工作原理:了解浏览器的工作原理,包括解析HTML和CSS、构建DOM树和CSSOM树、渲染页面等过程,掌握性能优化和兼容性处理的方法。 4. 前端框架原理:熟悉常用的前端框架(如React、Vue、Angular等)的原理和机制,能够合理使用框架提供的API和功能,提高开发效率和代码质量。 5. 数据交互原理:了解HTTP协议和RESTful架构,掌握AJAXFetch等数据交互技术,能够进行前后端数据的交互和通信。 6. 前端性能优化原理:了解网页性能优化的方法和策略,包括减少HTTP请求、压缩和合并文件、使用缓存、优化代码等,提升网站的加载速度和用户体验。 7. 前端安全原理:了解前端安全的基本概念和常见攻击方式,掌握防范XSS攻击、CSRF攻击等安全策略,保障用户的信息安全。 8. 前端工程化原理:熟悉前端工程化的思想和工具链,了解模块化、构建工具、自动化测试、代码规范等,提高团队的协作效率和项目的可维护性。 9. 跨平台开发原理:了解不同平台的特点和适配方法,熟悉Hybrid App和PWA等跨平台开发技术,能够为不同平台开发优化的前端应用。 10. 用户体验原理:理解用户体验的重要性,学会分析用户需求和行为,熟悉用户调研和交互设计的方法,设计出符合用户期望的优秀前端界面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值