Javascript·深入学习基础知识2

代码源码

javascript 复制代码
// 更新订单跟踪截止日期
async function updateOrderDeadline(orderId, deadline) {
    const res = await fetch(`${API_BASE}/orders/${orderId}/deadline`, {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        credentials: 'include',
        body: JSON.stringify({ followup_deadline: deadline })
    });
    if (!res.ok) {
        const data = await res.json();
        throw new Error(data.message || '更新失败');
    }
    return await res.json();
}

这段代码是标准的异步网络请求 封装,专门负责跟后端 API 打交道。它用到了现代 JavaScript 的 async/await 语法,让代码读起来像同步流程一样清晰。为了让你彻底理解,咱们还是把它拆解成几个步骤,顺便解释一下这里面的"黑话"。


⚙️ 函数定义与 async

javascript 复制代码
// 更新订单跟踪截止日期
async function updateOrderDeadline(orderId, deadline) {
  • async : 这个关键字放在函数前面,意思是"这个函数是异步的 "。它允许我们在函数内部使用 await(稍后解释)。这也意味着这个函数执行后,会返回一个 Promise(一个代表"未来结果"的承诺)。
  • orderId: 订单的唯一编号(比如 "ORD-12345"),告诉服务器要改哪一个订单。
  • deadline: 新的截止日期时间字符串。

🌐 发送网络请求 (fetch + await)

javascript 复制代码
    const res = await fetch(`${API_BASE}/orders/${orderId}/deadline`, {
        method: 'PUT',
        headers: { 'Content-Type': 'application/json' },
        credentials: 'include',
        body: JSON.stringify({ followup_deadline: deadline })
    });

这是核心部分,分为两层:

1. fetch(...)

这是浏览器自带的"打电话"功能,用来请求服务器。它接收两个参数:

  • URL 地址 : $ {API_BASE}/orders/ $ {orderId}/deadline
    • 这是一个模板字符串(用反引号 ` 包裹)。
    • ${orderId} 会把变量 orderId 的值直接塞进网址里。
    • 比如变成:/api/orders/1001/deadline。
  • 配置对象 (大括号里的内容):
    • method: 'PUT' : 告诉服务器我们要更新数据。(GET 是获取,POST 是新建,PUT 是更新)。
    • headers : 设置请求头。'Content-Type': 'application/json' 告诉服务器:"我发给你的数据是 JSON 格式的"。
    • credentials: 'include' : 这个很重要。它告诉浏览器:"发送请求时,带上用户的登录凭证(Cookie)"。如果没有这一行,服务器可能不知道是谁在发请求,从而拒绝访问。
    • body : 实际发送的数据。
      • JSON.stringify(...): 把 JavaScript 的对象 { followup_deadline: deadline } 转换成 JSON 字符串,因为网络传输只能传字符串。
2. await
  • fetch 默认是异步的(发完请求就往下跑,不等结果)。
  • 加上 await 后,代码会暂停 在这里,直到服务器返回结果,才把结果赋值给变量 res (response)。这让代码逻辑变得像写流水账一样简单。

🛡️ 错误处理

javascript 复制代码
    if (!res.ok) {
        const data = await res.json();
        throw new Error(data.message || '更新失败');
    }
  • res.ok : 这是一个布尔值。如果服务器返回的状态码是 200 系列 (比如 200 OK, 201 Created),它就是 true。如果是 400 (错误请求) 或 500 (服务器崩溃),它就是 false。
  • !res.ok : 意思是"如果不成功"。
  • await res.json(): 把服务器返回的错误信息(通常是 JSON 格式)解析出来。
  • throw new Error(...) : 手动抛出一个错误。这会立即停止函数执行,并把控制权交给调用它的地方的 .catch() 代码块。
    • data.message || '更新失败': 如果服务器返回了具体的错误消息(比如"日期格式不对"),就用那个消息;否则显示默认的"更新失败"。

📦 返回结果

javascript 复制代码
    return await res.json();
}
  • 如果上面没有报错(也就是 res.ok 是 true),代码会运行到这里。
  • return await res.json() : 把服务器返回的成功数据解析成 JavaScript 对象,并返回给调用者。
    • 这样,在上一段代码 saveDeadlineFromInput 中,updateOrderDeadline(...) 就能拿到服务器确认更新后的最新数据。

📌 总结:这段代码在做什么?

想象你是一个采购员:

  1. async function: 你领到了一个任务:"去更新截止日期"。
  2. await fetch(...) : 你拿着订单号(orderId)和新日期,跑到经理办公室(服务器)。你在门口等着 (await),直到经理处理完。
  3. method: 'PUT' : 你告诉经理:"我是来修改信息的,不是来新建的"。
  4. credentials: 'include' : 你进门时出示了你的工牌(Cookie),证明你是公司员工。
  5. if (!res.ok) : 经理看了一眼。如果经理皱眉(报错,比如工牌过期),你就拿着经理给的拒绝理由(data.message),跑回去告诉老板"出错了!"(throw new Error)。
  6. return await res.json() : 如果经理点头说"改好了",你就拿着经理签字的确认单(返回的数据),跑回去交给你的老板(saveDeadlineFromInput 函数)。
相关推荐
Wang's Blog1 分钟前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
kyriewen2 分钟前
我上手了 Vite+ 1.0:Node 不用自己装,lint 却翻车了
前端·javascript·程序员
欣欣之王来了14 分钟前
Vue3项目脚手架:Vite vs Vue CLI怎么选?
前端·学习·架构·项目·vue3教程
kaixin_啊啊19 分钟前
【零基础学AI】第 7 章——让 AI 辅助学习和办公
人工智能·学习
信奥卷王19 分钟前
[GESP202506 六级] 学习小组(含视频)
学习
鹏多多1 小时前
前端是如何死去的?| 完整时间线
前端·javascript·程序员
古夕1 小时前
iframe 授权失败时露出 60000 JSON 的复盘
前端·javascript
宛 禾2 小时前
Qt 控件入门:QLabel 从拖拽到对象树,一篇讲透
c++·qt·学习
程序员Sunday2 小时前
ES Module 和 CommonJS 有什么区别?循环依赖时会发生什么?
前端·javascript·面试
程序喵大人2 小时前
【C++入门】编译链接模型 - 07 链接器怎样把符号对上号
开发语言·c++·编译器·编译链接·链接器