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

RxJS实现翻译查询后分场景执行httpPut/httpPost的正确写法

RxJS 翻译增改逻辑规范实现

核心实现完全规避嵌套subscribe写法,同时补全原代码缺失的新增逻辑,保证所有请求执行状态可控。

import { switchMap, forkJoin, concat, catchError, of } from 'rxjs';

// 初始化UI侧已填写的有效语言映射,后续新增语言只需在此处追加条目
const uiFilledLangMap = new Map<string, string>();
if (chineseInUI?.trim()) uiFilledLangMap.set(chineseCode, chineseInUI.trim());
if (spanishInUI?.trim()) uiFilledLangMap.set(spanishCode, spanishInUI.trim());
const baseRequestUrl = this.resourceApiService.getURL('translationmanagerURL');

this.GetTranslations(group)
  .pipe(
    // 串联拉取数据、批量增改两个阶段的数据流,替代嵌套订阅
    switchMap((res) => {
      // 将接口返回的现有翻译转为<语言编码, 翻译记录>映射,省去多层switch判断
      const existingLangMap = new Map(
        res.dataSet.map(record => [record.Language, record])
      );
      const pendingRequests = [];

      // 遍历UI填写的语言项,区分更新/新增场景构造请求
      uiFilledLangMap.forEach((langContent, langCode) => {
        const existingRecord = existingLangMap.get(langCode);
        if (existingRecord) {
          // 已有对应语言记录:构造PUT更新请求
          const updatePayload = {
            Id: existingRecord.Id,
            Language: existingRecord.Language,
            PhraseKey: existingRecord.PhraseKey,
            PhraseValue: langContent
          };
          pendingRequests.push(
            this.webApiService.httpPut$(`${baseRequestUrl}${existingRecord.Id}`, updatePayload)
          );
        } else {
          // 无对应语言记录:构造POST新增请求
          const createPayload = {
            Language: langCode,
            PhraseKey: group,
            PhraseValue: langContent
          };
          pendingRequests.push(
            this.webApiService.httpPost$(baseRequestUrl, createPayload)
          );
        }
      });

      // 无待提交请求直接返回空结果,有请求则等待所有请求执行完成
      return pendingRequests.length ? forkJoin(pendingRequests) : of([]);
    }),
    // 统一捕获全链路错误,避免未捕获异常导致流中断
    catchError((err) => {
      console.error('翻译提交失败', err);
      return of([]);
    })
  )
  .subscribe({
    next: (submitResults) => {
      // 所有请求执行完成后的回调,可写成功提示、列表刷新等逻辑
      console.log('所有翻译提交完成', submitResults);
    }
  });

关键说明

  • 规避嵌套订阅:通过switchMap高阶操作符串联异步流,符合RxJS最佳实践,不会出现回调地狱问题
  • 维护成本更低:替换原代码中switch case的分支判断逻辑,用Map做语言编码和记录的快速匹配,后续新增其他语言(如日语、法语)仅需在uiFilledLangMap初始化时追加对应条目即可,无需修改核心匹配逻辑
  • 执行顺序可控:默认使用forkJoin并行发起所有增改请求,性能更高,且会等待所有请求返回后再触发完成回调;如果需要请求按顺序串行执行,只需将forkJoin(pendingRequests)替换为concat(...pendingRequests)即可
  • 补全业务缺口:原代码仅处理了已有语言的更新逻辑,未覆盖「UI填写语言不存在需新增」的场景,当前实现完整覆盖两类需求
  • 错误处理统一:通过catchError捕获拉取数据、增改请求全流程的错误,不会出现未捕获的订阅异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:54:22