You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在TypeScript中使用Autorest时如何取消正在进行的客户端请求

TypeScript 中 Autorest 客户端请求取消实现方案

官方推荐方案:通过请求可选参数传递 AbortSignal

Autorest 生成的 TypeScript 客户端的所有接口请求方法,默认支持在最后一个可选配置参数中传入 abortSignal 实现请求取消,无需手动操作 RequestPrepareOptions,实现步骤如下:

  • 安装依赖(如果项目没有预装):npm install @azure/abort-controller @azure/core-http
  • 初始化 AbortController 实例,将实例的 signal 属性传入请求的可选配置项中
  • 需要取消请求时,调用控制器的 abort() 方法即可

代码示例:

import { AbortController } from "@azure/abort-controller";
// 替换为你自己项目中 Autorest 生成的客户端
import { YourServiceClient } from "./generated/yourServiceClient";

const client = new YourServiceClient(/* 客户端基础配置,比如服务地址、认证参数等 */);
const abortController = new AbortController();

// 发起请求
async function callApi() {
  try {
    const res = await client.yourApiMethod(
      // 接口的必填参数依次放在前面
      "param1",
      123,
      // 最后一个参数为请求可选配置
      {
        abortSignal: abortController.signal
      }
    );
    console.log("请求成功", res);
  } catch (err) {
    if (err.name === "AbortError") {
      console.log("请求已被手动中止");
      return;
    }
    // 其他业务错误处理
    console.error("请求错误", err);
  }
}

callApi();

// 需要中止请求时调用
// abortController.abort();

兼容旧版本方案:自定义请求管道注入取消信号

如果你使用的 Autorest 版本较老,生成的客户端方法没有暴露 abortSignal 配置项,可以通过自定义请求策略的方式,把取消信号注入到外发请求中,实现全局或单客户端维度的请求控制:

import { BaseRequestPolicy, RequestPolicy, RequestPolicyFactory, RequestPolicyOptions } from "@azure/core-http";
import { AbortSignal } from "@azure/abort-controller";

// 定义中止请求的策略工厂
const abortPolicyFactory = (abortSignal: AbortSignal): RequestPolicyFactory => {
  return {
    create: (nextPolicy: RequestPolicy, options: RequestPolicyOptions) => {
      return new class extends BaseRequestPolicy {
        sendRequest(httpRequest) {
          // 给所有外发请求绑定取消信号
          httpRequest.abortSignal = abortSignal;
          return nextPolicy.sendRequest(httpRequest);
        }
      }(nextPolicy, options);
    }
  };
};

// 初始化客户端时注入策略
const abortController = new AbortController();
const client = new YourServiceClient(/* 基础配置 */, {
  clientOptions: {
    additionalPolicies: [
      {
        policy: abortPolicyFactory(abortController.signal),
        position: "perCall"
      }
    ]
  }
});

注意:如果需要对多个请求做单独的取消控制,建议优先使用第一种方法,为每个请求传入独立的 abortSignal;第二种方法注入的策略会作用于当前客户端实例发起的所有请求,适合批量取消的场景。


内容的提问来源于stack exchange,提问作者rysama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:36:03