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

如何依次订阅Observable类型的GraphQL请求?

依次执行GraphQL Mutate请求的实现方案

首先要注意:你当前的代码里直接调用mutate生成的Observable会立即启动执行,无法实现“等待前一个完成再执行下一个”的逻辑。需要先把每个请求封装成返回Observable的工厂函数,这样可以按需触发执行。


方法一:使用RxJS concat操作符(RxJS环境推荐)

concat操作符会严格按顺序订阅每个Observable,只有当前一个完成(无论成功/失败)才会订阅下一个。如果需要报错后继续执行,要给每个Observable添加错误捕获逻辑。

代码示例

// 1. 重构请求为工厂函数(调用时才执行mutate)
const requestFactories = [
  () => this.updateUserGQL.mutate({ input: { name: 'x' } }),
  () => this.updateUserGQL.mutate({ input: { name: 'y' } }),
  // 添加更多请求...
];

// 2. 使用concat构建顺序执行序列
import { concat, of } from 'rxjs';
import { catchError } from 'rxjs/operators';

const sequential$ = concat(
  ...requestFactories.map(factory => 
    factory().pipe(
      catchError(err => {
        console.error('请求失败:', err);
        // 返回完成态Observable,让concat继续执行下一个
        return of(null);
      })
    )
  )
);

// 3. 订阅开始执行
sequential$.subscribe({
  next: res => res && console.log('请求成功:', res),
  complete: () => console.log('所有请求执行完毕')
});

如果需要报错即终止后续请求,直接去掉catchError即可。


方法二:使用async/await循环(Promise环境推荐)

将Observable转换为Promise,通过for循环依次等待每个请求完成,错误捕获后可选择继续执行。

代码示例

// 1. 同样先定义请求工厂函数
const requestFactories = [
  () => this.updateUserGQL.mutate({ input: { name: 'x' } }),
  () => this.updateUserGQL.mutate({ input: { name: 'y' } }),
  // 添加更多请求...
];

// 2. 用async函数执行循环
import { firstValueFrom } from 'rxjs';

async function runSequentialRequests() {
  for (const factory of requestFactories) {
    try {
      // 将Observable转为Promise并等待完成
      const result = await firstValueFrom(factory());
      console.log('请求成功:', result);
    } catch (err) {
      console.error('请求失败:', err);
      // 捕获错误后继续执行下一个,若要终止则抛出err
    }
  }
  console.log('所有请求执行完毕');
}

// 3. 启动执行
runSequentialRequests();

注:RxJS 7+推荐使用firstValueFrom/lastValueFrom替代旧的toPromise()方法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:52:54