关于Promise和fetch的使用

Promise

一般来说promise是一个工厂函数,其调用的resolve,reject,all,race 这些方法称之为工厂方法。

通常我们构造一个函数我们用 new ,但是如果我们有特殊需求的时候,就会用到工厂模式,一个构造工厂.

fetch

fetch的优势

fetch是浏览器提供的,是浏览器支持的,用于访问和操纵 HTTP 管道的一些具体部分,例如请求和响应,该方法提供了一种简单,合理的方式来跨网络异步获取资源。

fetch是一个让我们处理http pipeline更容易的工具,

http pipeline是什么
在HTTP1.1之前是一个请求发出去一个请求回来,才会继续下一个,时间浪费在服务端和客户端之间通信。
开启这个,就会请求发送和返回是自己顾自己的,请求一个一个发过去,一个一个回来,也就是说你只管发,然后接只管接,前提就是server有额外处理的能力。

fetch的返回是一个promise

  • resolve 发生在网络通信正常(404,500也是resolve)
  • reject 发生在网络通信异常

当只有在网络通信出现问题的时候才会放回reject,在其他情况下我们都是返回resolve,并且网络波动发生错误是我们不能直接干预的,一般情况网络波动的状态码会自己返回。

fetch发送请求,默认是不发送cookie的(需要手动进行设置)

fetch的使用

基本使用

fetch('www.dev.com')
  .then(response => response.json())
  .then(data => console.log(data));

fetch 的基本参数 

//url 请求的地址 init 对你请求发出的一些基本配置,初始化
fetch('url',init)

init就是内容里写 请求的方法,请求的请求头,和请求体的编写。

使用

fetch('www.dev.com',{
medth:'POST',
headers:{
 'Content-Type': 'application/json'
},
body:JSON.stringify(data) 
})
.then(resp=>resp.json())
.then(data => console.log(data))

headers里面的内容一般请求头上有的都可以使用。

注意:mode: "no-cors" 仅允许使用一组有限的 HTTP 请求头:

  • Accept
  • Accept-Language
  • Content-Language
  • Content-Type 允许使用的值为:application/x-www-form-urlencodedmultipart/form-data 或 text/plain

发送带有cookie的请求

fetch('www.dev.com',{
credentials: 'include'
})
.then(resp=>resp.json())
.then(data => console.log(data))

medth 不写就是代表GET请求 

fetch带来的便利

1.因为fetch是浏览器支持的,所以我们是可以直接在浏览器的控制台里使用,

来重新请求该失败的请求

 可以看到,这里其实是可以在控制台里直接发送,而且返回是一个promise,

其实这里请求一个报错的,

因为我是在百度下面请求百度,因为百度里面并没有百度这个url

请求'/'就是重新请求 当前网页。

2.因为fetch请求是一个公共的浏览器标准,都可以使用

不用去请求一个库在去用里面的请求方法,而是可以直接使用fetch请求。

应对不稳定的网络环境-指数补偿
按照指数的时间倍数重复发送请求
0ms
200ms
400ms
800ms
1600ms
3200ms
fail
如果我们在0ms发一个请求,200ms没回来,我们就会继续发,如果200ms发出,到400ms还没回来,那么就在发如果到800之前200ms的请求回来,那么就不发了,如果3200ms还没回来那就认为网络断开了

t 指数

resolved 是请求成功了

 

 如果大于16(3200ms)就认为网络断开,不做了

如果小

请求数据

 

 没有返回增加指数

小结 

从架构方面来讲,优化只是工程问题,
优化不是你一个页面的问题,而是所有页面的问题。
而是一类问题,提供工具

这样才能让你的项目更加优秀。

`fetch` 是现代浏览器内置的一个用于发起网络请求的 API,它返回一个 `Promise` 对象。通过这个对象可以更方便地处理异步操作的结果。 ### **什么是 Promise?** `Promise` 是一种处理异步操作的对象,在 JavaScript 中广泛使用。它的状态有三种: 1. **Pending**(进行中):初始状态,既不是成功也不是失败。 2. **Fulfilled**(已成功):操作完成并返回结果。 3. **Rejected**(已失败):操作出错,并给出错误原因。 通过 `.then()` `.catch()` 方法,我们可以分别监听成功的回调失败的错误处理。 --- ### **Fetch 的基本用法** #### 示例代码 ```javascript // 使用 fetch 发起 GET 请求 fetch('https://jsonplaceholder.typicode.com/posts/1') .then(response => { // 检查响应是否成功 (status code 在 200-299 范围内) if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.json(); // 将响应体解析为 JSON 格式 }) .then(data => { console.log(data); // 打印从服务器接收到的数据 }) .catch(error => { console.error('Request failed:', error); }); ``` #### 解释: 1. `fetch(url)` 返回的是一个 `Promise`,该 `Promise` 包含了 HTTP 响应信息。 2. 使用 `.then(response => ...)` 可以获取到原始的响应数据 (`Response` 对象),需要进一步解析其内容(例如调用 `response.json()` 来提取 JSON 数据)。 3. 如果发生错误,可以用 `.catch(err => ...)` 进行捕获。 --- ### **Fetch 支持的功能** 1. **GET、POST 等各种 HTTP 方法支持** 默认情况下,`fetch` 使用的是 GET 请求,如果想发送 POST 或其他类型的请求,可以传递第二个配置参数: ```javascript fetch('https://jsonplaceholder.typicode.com/posts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ title: 'foo', body: 'bar', userId: 1 }) // 提交的内容 }) .then(response => response.json()) .then(data => console.log(data)); ``` 2. **设置超时时间** Fetch 自身并不直接提供超时功能,但我们可以通过外部包装来实现这一点: ```javascript const fetchWithTimeout = (url, options, timeout = 5000) => Promise.race([ fetch(url, options), new Promise((_, reject) => setTimeout(() => reject(new Error('请求超时')), timeout) ) ]); fetchWithTimeout('https://example.com/data', {}, 3000) .then(res => res.json()) .catch(console.error); ``` 3. **跨域资源共享(CORS)** `fetch` 遵循同源策略,默认只允许简单请求或 CORS 允许的情况。对于复杂场景(如自定义头部),服务端需正确配置 CORS 规则。 --- ### **优点与缺点** #### 优点: - 更简洁优雅的语法; - 内置对 `Promise` 的原生支持; - 易于链式调用,避免嵌套回调函数问题。 #### 缺点: - 不自动携带 Cookie 或身份验证凭据(除非明确指定 `{credentials: 'include'}` 参数); - 错误处理不够直观(仅当网络连接完全中断才进入 catch 分支,而像 4xx 5xx 响应不会被视为异常); ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值