编辑
2024-12-11
JavaScript
00
请注意,本文编写于 122 天前,最后修改于 120 天前,其中某些信息可能已经过时。

目录

1. fetch() 返回的是一个 Promise
2. fetch() 返回的 Promise 与网络请求的状态
3. 使用 async/await 处理 fetch() 和 Promise
4. 总结

Promisefetch() 之间的联系非常紧密。fetch() 是基于 Promise 的一种 API,用来发起网络请求。它返回一个 Promise,让你能够使用 then()catch()async/await 来处理异步操作的结果。

1. fetch() 返回的是一个 Promise

fetch() 是现代 JavaScript 用于发起 HTTP 请求的标准方法。它默认返回一个 Promise,该 Promise 在请求完成时解决(resolved),并返回 Response 对象(如果请求成功)。如果请求失败(例如网络问题),该 Promise 会被拒绝(rejected),并返回错误信息。

示例:

javascript
fetch('https://api.example.com/data') .then(response => { // 当请求成功时,返回响应数据 return response.json(); // 将响应转为 JSON 格式 }) .then(data => { // 处理 JSON 数据 console.log(data); }) .catch(error => { // 处理错误 console.error('请求失败:', error); });

在这个例子中,fetch() 返回一个 Promise,你使用 .then() 来处理响应,使用 .catch() 来处理错误。

2. fetch() 返回的 Promise 与网络请求的状态

fetch() 本身并不会拒绝 Promise,即使请求失败(例如 404 或 500 错误)。它只会拒绝在以下情况下:

  • 网络故障(无法连接服务器)
  • 请求超时

即使服务器返回 404 或 500 错误,fetch() 也会将 Promise 状态设置为 resolved,但 Response 对象的 ok 属性将为 false。你仍然需要手动检查响应的状态码,来判断请求是否成功。

javascript
fetch('https://api.example.com/data') .then(response => { if (!response.ok) { return Promise.reject('网络错误或响应失败'); // 自定义错误处理 } return response.json(); }) .then(data => { console.log(data); }) .catch(error => { console.error('请求失败:', error); });

3. 使用 async/await 处理 fetch()Promise

因为 fetch() 返回的是一个 Promise,你也可以使用 async/await 来简化异步代码。

javascript
async function fetchData() { try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error('请求失败'); } const data = await response.json(); console.log(data); } catch (error) { console.error('请求失败:', error); } } fetchData();

在这个例子中,await 等待 fetch() 完成并返回 Response 对象。如果响应不成功(response.okfalse),则抛出错误。catch 用来捕获错误并处理。

4. 总结

  • fetch() 返回一个 Promise,使得你可以使用 then()catch()async/await 来处理异步结果。
  • Promise 用于表示异步操作的最终结果(成功或失败),而 fetch() 则通过 Promise 机制让我们能够处理 HTTP 请求的成功与失败。
  • 你可以结合 Promisefetch() 来执行链式操作,或者通过 async/await 语法让代码更简洁和易于阅读。

因此,Promisefetch() 处理异步请求的核心机制,两者密切结合,帮助开发者以更加清晰、结构化的方式处理 HTTP 请求和响应。

本文作者:空白格

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!