跳到主要内容

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() 方法。它返回 void,可以直接调用而无需 await

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() 后仍可获取结果

调用 .fire() 后,仍然可以通过 await 获取请求结果:

import { request } from "keq"

const req = request.get("/api/cats")

req.fire()  // 触发请求

const result = await req  // 仍然可以获取结果