【发布时间】:2020-08-31 00:10:32
【问题描述】:
我有一个 API PUT 到 /api,我想通过链接它们来防止同时发送多个请求:第二个调用应该等待第一个调用完成,依此类推。不应忽略任何呼叫(我不谈论油门/去抖动/速率限制)。
目前,我想出的唯一解决方案是Promise
@Injectable({providedIn: 'root'})
export class ApiService {
private lastCall: Promise<null> = Promise.resolve(null);
constructor(private readonly httpClient: HttpClient}
async update(data: Data): Promise<null> {
this.lastCall = this.lastCall.finally(() =>
this.httpClient.put<null>('/api', data).toPromise(),
);
}
}
不知道有没有更好的rxjs解决方案比如concatMap运算符在ngrx效果中使用,但我想在服务层面实现:
update$ = createEffect(() => this.actions$.pipe(
ofType(updateAction),
concatMap(action => this.api.update(...)),
));
【问题讨论】:
-
你已经有了答案
-
我只对
Observable的解决方案感兴趣,而无需转换为/返回Promise,因为经过 1 小时的反思后我找不到任何东西。 -
你为什么不在
update(...)里面返回this.httpClient.put<null>('/api', data)? -
因为我想要 ApiService 级别的行为,而不是效果级别的行为,因为 API 在多个位置使用。
标签: angular typescript rxjs angular-httpclient