Derive & Fire
Keq 提供了 .derive() 和 .fire() 两个方法,用于从已有请求派生新实例和触发请求但不等待结果。
派生请求 - derive()
.derive() 从当前请求派生出一个全新的、未发送的请求实例。派生的请求继承原始请求的所有配置(URL、Headers、Body、Query、中间件、选项等),但拥有完全独立的生命周期。
基本用法
import { request } from "keq"
const base = request
.get("/api/cats")
.set("Authorization", "Bearer token")
.query("breed", "british_shorthair")
const page1 = await base.derive()
.query("page", 1)
const page2 = await base.derive()
.query("page", 2)
const page3 = await base.derive()
.query("page", 3)从已发送的请求派生
即使基础请求已经被 await 过,仍然可以继续调用 .derive() 派生新请求:
import { request } from "keq"
const base = request
.get("/api/cats")
.set("Authorization", "Bearer token")
// 先发送一次
const firstPage = await base
// 基础请求已发送,但仍可以派生
const secondPage = await base.derive()
.query("page", 2)
const thirdPage = await base.derive()
.query("page", 3)并发派生
多个派生请求可以并发执行,互不影响:
import { request } from "keq"
const base = request
.get("/api/cats")
.set("Authorization", "Bearer token")
const [page1, page2, page3] = await Promise.all([
base.derive().query("page", 1),
base.derive().query("page", 2),
base.derive().query("page", 3),
])状态隔离
派生的请求与原始请求完全独立——修改派生请求的参数不会影响原始请求,反之亦然:
import { request } from "keq"
const base = request
.get("/api/cats")
.set("Authorization", "Bearer token")
const derived = base.derive()
derived.query("page", 2)
derived.set("X-Custom", "value")
// base 的参数不会被修改触发请求但不等待 - fire()
当你只需要发送请求而不关心结果时(fire-and-forget),使用 .fire() 方法。它返回请求实例本身,可以直接调用而无需等待结果;需要终止请求时,可以继续使用该实例调用 .abort():
import { request } from "keq"
// 发送埋点请求,不需要等待结果
request
.post("/analytics/event")
.send({ event: "page_view", page: "/home" })
.fire()与 derive 结合使用
import { request } from "keq"
const tracker = request
.post("/analytics/event")
.set("Authorization", "Bearer token")
// 在不同时机发送不同的埋点事件
tracker.derive()
.send({ event: "page_view", page: "/home" })
.fire()
tracker.derive()
.send({ event: "button_click", target: "submit" })
.fire()fire() 与 abort
.fire() 返回请求实例本身,因此之后可以在需要时调用 .abort() 终止请求,详见终止请求:
import { request } from "keq"
const req = request.get("/api/cats").fire() // 触发请求
// 之后需要时终止请求
req.abort()