fetch = function used for making HTTP requests to fetch resources. (json style data, images, files) fetch(url, {options})

展示两种写法: 1️⃣ Promise 链式写法 2️⃣ async / await 写法(语法糖版)

// ==================== Promise 链式写法 ====================
// 向 PokeAPI 发起 HTTP 请求,获取 "pikachu" 的数据
fetch("https://pokeapi.co/api/v2/pokemon/pikachu")
  .then(response => {
 
    // 如果服务器返回的响应状态码不是 200~299(成功),手动抛出错误
    if(!response.ok){
        throw new Error("could not fetch resource"); 
        // ✅ 用于捕捉网络错误、404、500 等异常情况
    }
 
    // response.json() 会将原始响应体(JSON 格式)解析为 JS 对象
    // ⚠️ 注意:response.json() 也返回一个 Promise
    return response.json();
  })
  // 当 JSON 数据解析成功后进入下一个 then()
  .then(data => console.log(data.id)) // 输出 Pokémon 的 id(如 25)
  // 如果请求失败、解析失败、或上方 throw 抛出错误,则进入 catch()
  .catch(error => console.log(error));
  • fetch() 是一个内置的异步 API,用于请求服务器资源(如 API)。
  • 它返回一个 Promise 对象,表示“未来会返回的数据”。
  • .then() 链式调用依次处理异步结果。
  • .catch() 用来捕获所有错误(包括网络断开、404、语法错误等)。
// ==================== async / await 写法 ====================
// ⚠️ 先执行函数调用(因为函数定义在下方)
fetchData();
 
async function fetchData(){
 
  try{
    // 使用 await 等待 fetch 请求完成
    const response = await fetch("https://pokeapi.co/api/v2/pokemon/pikachu");
 
    // 检查响应状态是否正常
    if(!response.ok){
      throw new Error("could not fetch resource");
    }
 
    // 解析 JSON 数据,同样使用 await 等待解析完成
    const data = await response.json();
 
    // 输出结果(这次输出 name 属性)
    console.log(data.name); // pikachu
  }
  catch(error){
    // 捕获上方 try 块中所有错误(包括 fetch 失败或 throw 出来的错误)
    console.error(error);
  }
}
  • async function 声明一个异步函数,返回一个 Promise。
  • await 关键字会“暂停”代码执行,直到 Promise 完成。
  • 用 try…catch 可以更直观地捕获错误。
  • 相比 .then() 链式写法,结构更清晰、可读性更强。

Example

// 异步函数:用 async 声明,允许在内部使用 await
async function fetchData(){
 
  try{
    // ===================== 1️⃣ 获取用户输入 =====================
    // 从输入框中取出用户输入的宝可梦名字
    // 并统一转换成小写(API 区分大小写,例如 Pikachu → pikachu)
    const pokemonName = document.getElementById("pokemonName").value.toLowerCase();
 
    // ===================== 2️⃣ 向 API 发送请求 =====================
    // 使用模板字符串将用户输入插入到 URL 中
    const response = await fetch(`https://pokeapi.co/api/v2/pokemon/${pokemonName}`);
 
    // ===================== 3️⃣ 检查响应状态 =====================
    // fetch() 不会自动抛出 HTTP 错误(如 404、500),
    // 所以需要手动判断 response.ok 是否为 true。
    if(!response.ok){
      throw new Error("could not fetch resource"); // 主动抛出错误
    }
 
    // ===================== 4️⃣ 解析响应数据 =====================
    // response.json() 会解析服务器返回的 JSON 数据
    // await 等待解析完成后得到 JS 对象
    const data = await response.json();
 
    // ===================== 5️⃣ 从数据中提取图片 =====================
    // 通过查阅 PokeAPI 文档得知:
    // Pokémon 图片在 data.sprites.front_default 中
    const pokemonSprite = data.sprites.front_default;
 
    // ===================== 6️⃣ 更新网页中的图片元素 =====================
    // 获取页面中的 <img id="pokemonSprite"> 元素
    const imgElement = document.getElementById("pokemonSprite");
 
    // 修改图片的 src 属性,让它显示对应宝可梦的图片
    imgElement.src = pokemonSprite;
 
    // 确保图片可见(可能一开始在 CSS 里设置了 display:none)
    imgElement.style.display = "block";
  }
 
  // ===================== 7️⃣ 错误捕获 =====================
  catch(error){
    // 捕捉上方任意一步中的错误(包括网络失败、输入错误等)
    console.error(error);
 
    // 你也可以在这里显示用户友好的提示,例如:
    // document.getElementById("errorMessage").textContent = "Pokémon not found!"
  }
}