您现在的位置:首页 >> 污染防治

Ajax 之战:XMLHttpRequest 与 Fetch API

时间:2023-03-10 12:17:40

h (err) {console.error("error:", err);}

Fetch 来得清晰、来得简洁,并且经常在 Service worker 之中适用。

开放源码但会话重播

OpenReplay 是 FullStory 和 LogRocket 的开放源码制成品,它通过录像使用者在你的客户端上的一切操作,并结果显示每个弊端的操作指针,透过非常简单的可观察官能。OpenReplay 是自转交的,可以完全操纵你的资料。

孤独仿真吧!现代的尾部设计团队 —— 开始自由地追踪你的 web 客户端。

第 1 淘汰赛:Fetch 取得胜利

与陈从新的 相比,Fetch API 除了具来得清晰简洁的句法之外,还有其它几个优势。

后头、乞求和作出反应某类

上面来得加简单 fetch 举例来说之中,适用一个字串定义 URL 端点,也可以发送至一个可配置的 Request 某类,它透过了有关调用的一系列一般来说:

const request = new Request("/service", { method: "POST" });

console.log(request.url);console.log(request.method);console.log(request.credentials);

// FormData representation of bodyconst fd = await request.formData;

// clone requestconst req2 = request.clone;

const res = await fetch(request);

Response 某类透过了对次访问所有详细信息的多种不同次访问:

console.log(res.ok); // true/falseconsole.log(res.status); // HTTP statusconsole.log(res.url);

const json = await res.json; // parses body as JSONconst text = await res.text; // parses body as textconst fd = await res.formData; // FormData representation of body

Headers 某类透过了一个来得加简单的接口来分设乞求之中的后头信息或借助作出反应之中的后头信息:

// set request headersconst headers = new Headers;headers.set("X-Requested-With", "ajax");headers.append("Content-Type", "text/xml");

const request = new Request("/service", {method: "POST",headers,});

const res = await fetch(request);

// examine response headersconsole.log(res.headers.get("Content-Type"));

线程操纵

在 之中行政线程具娱乐官能,你确实但会发现有适当外加一个随机浏览字串值来越过网页线程,Fetch 法则在第二个数值 init 某类之中外设了对线程的支持者:

const res = await fetch("/service", {method: "GET",cache: "default",});

线程可以分设为:

'default' —— 如果有一个新的 (未过期的) 匹配,则适用网页线程;如果很难,网页但会送达一个带上条件的乞求来安全检查海洋资源是否已改变,并在适当才但会送达新的乞求 'no-store' —— 越过网页线程,并且互联作出反应仍要来得换它 'reload' —— 越过网页线程,但是互联作出反应但会来得换它 'no-cache' —— 多种不同于'default',除了一个条件乞求显然被来作 'force-cache' —— 如果确实,适用线程的非常简单版,即使它累赘了 'only-if-cached' —— 不尽相同的 force-cache,除了很难互联乞求

跨域操纵

跨域协作强制浏览器分镜向另一个域送达 Ajax 乞求,假定是该客户端强制 Access-Control-Allow-Origin 作出反应后头之中的源域;如果很难分设这个数值, fetch 和 都但会失败。但是,Fetch 透过了一个方式在一般来说,可以在第二个数值的 init 某类之中分设‘no-cors’一般来说。

const res = await fetch('', {method: 'GET',mode: 'no-cors'});

这将赶回一个无法读取但可以被其它的 API 适用的作出反应。例如,你可以适用 Cache API 存储赶回再行之后适用,确实从 Service Worker 赶回一个图像、分镜或 CSS 明文。

凭证操纵

显然发送网页 cookie,Fetch API 仍要发送 cookie,除非你显式地在第二个数值 init 某类之中分设 credentials 一般来说。

const res = await fetch("/service", {method: "GET",credentials: "same-origin",});

credentials 可以分设为:

'omit' —— 排除 cookie 和 HTTP 认证项 (当前) 'same-origin' —— 包含对相似官能 url 的乞求的凭证 'include' —— 包含所有乞求的凭证

请注意,include 是以前 API 解决问题之中的当前值,如果你的使用者确实运营从新的网页,就得显式地分设 credentials 一般来说。

但会话操纵

当前前提,fetch 和 都遵循客户端但会话。但是,fetch 在第二个数值 init 某类之中透过了替代配置文件:

const res = await fetch("/service", {method: "GET",redirect: "follow",});

redirect 可以分设为:

'follow' —— 遵循所有但会话(当前) 'error' —— 发生但会话时暂时之中止(拒绝接受) 'manual' —— 赶回手动处理的作出反应

资料流

将整个作出反应读入寄存器缓冲区,但是 fetch 可以因特网传输乞求和作出反应资料,这是一项新核心技术,流强制你在发送或转给时处理来得小的资料块。例如,你可以在完全流媒体前处理数兆元组明文之中的信息,下面的举例来说将传到的(二进制)资料块转换为文档,并将其驱动到基本功能。在较慢的连接上,你但会看着来得小的资料块在较长的小时内穿越。

const response = await fetch("/service"),reader = response.body.pipeThrough(new TextDecoderStream).getReader;

while (true) {const { value, done } = await reader.read;if (done) break;console.log(value);}

客户端端支持者

Deno 和 Node 18 之中完全支持者 Fetch,在客户端和浏览器适用不尽相同的 API 有助于下降认知价格,还透过了在任何地方运营的同构 Java 库的确实官能。

第二轮: 取得胜利

尽管存在缺陷, 还是有一些即兴可以突破 ajax Fetch。

延迟支持者

我们可以追踪乞求的延迟,通过将一个驱动程序外加到 某类的延迟惨案上。这在Youtube大明文(如合照)时除此以外适合于:

const xhr = new ;

// progress eventxhr.upload.onprogress = (p) => {console.log(Math.round((p.loaded / p.total) * 100) + "%");};

惨案驱动程序发送至的某类有三个一般来说:

lengthComputable —— 如果延迟可以计算,则分设为 true total —— 最新消息体的工作总量或内容可长度 loaded —— 到目前为止进行的工作或内容可的数量

Fetch API 很难透过任何法则来追踪Youtube延迟。

提前结束支持者

某类透过了一个 timeout 一般来说,可以将其分设为乞求操所写终止前强制运营的毫秒数;如果提前结束,就触发一个 timeout 惨案来处理:

const xhr = new ;xhr.timeout = 5000; // 5-second maximumxhr.ontimeout = => console.log("timeout");

fetch 之中可以积体电路一个数组来解决问题提前结束功能:

function fetchTimeout(url, init, timeout = 5000) {return new Promise((resolve, reject) => {fetch(url, init).then(resolve).catch(reject);setTimeout(reject, timeout);});}

或者,你可以适用 Promise.race:

Promise.race([fetch("/service", { method: "GET" }),new Promise((resolve) => setTimeout(resolve, 5000)),]).then((res) => console.log(res));

这两个法则都不容易适用,另外乞求将在亦同一直运营。

暂时之中止支持者

运营之中的乞求可以通过 的 abort 法则取消,如有适当,可以外加一个 abort 惨案来处理:

const xhr = new ;xhr.open("GET", "/service");xhr.send;

// ...

xhr.onabort = => console.log("aborted");xhr.abort;

你可以暂时之中止一个 fetch,但它不是那么直接,所需一个 AbortController 某类:

const controller = new AbortController;

fetch("/service", {method: "GET",signal: controller.signal,}).then((res) => res.json).then((json) => console.log(json)).catch((error) => console.error("Error:", error));

// abort requestcontroller.abort;

当 fetch 暂时之中止时,catch 块执行。

来得显式的故障验证

当共同开发小组第一次适用 fetch 时,假设一个 HTTP 错误,如 404 Not Found 或 500 Internal Server error 将触发 Promise 拒绝接受并运营系统性的 catch 块,这似乎是合乎逻辑的,但无论如何并非如此:Promise 成功地解决了这些作出反应,只有当互联很难作出反应或乞求被之中断时,才但会发生拒绝接受。

fetch 的 Response 某类透过了 status 和 ok 一般来说,但并不一定显然显式地所需安全检查它们, 来得具体,因为单个回退数组处理每一个结果:你必要在每个举例来说之中都看着 stuatus 安全检查。

网页支持者

我期盼你仍要支持者 Internet Explorer 或 2015 年之前的网页非常简单版,但如果是或许, 是你唯一的可选择。 也很稳定的,API 不太确实来得换。Fetch 尤其新,还依靠几个关键功能官能,虽然来得换不太确实毁坏代码,但你可以期待一些维护。

必要适用哪个 API ?

大多数共同开发小组都但会适用来得换的 Fetch API,它的句法来得简洁,比 来得有优势;也就是说,这些优点之中的许多都有特定的用例,但在大多数客户端之中都不所需它们。只有两种前提 仍必不可少:

你正在支持者来得加据闻的网页——这种需求但会随着小时的推移而下降。 你所需结果显示Youtube延迟条。Fetch 后续将但会支持者,但确实所需几年的小时。

这两种可选择都很有趣,值得详细明白它们!

原文单链接:

IT据闻兵谈笑如何带进Sun母公司第8号员工,网友:怀念那个“名副其实”的核心技术七十年代

之中国软件,从兴盛走向文明

撤出云和平台六年后,我们来作了一次“断网测试”

软件架构确实不是你也许的那个样子

点个在看少个 bug👇

河北白癜风
福州白癜风医院哪家比较专业
天津牛皮癣最好医院是哪个
再林阿莫西林颗粒对儿童扁桃体炎有效吗
重庆什么医院治疗白癜风好
相关阅读