angular - flatMap 不能按预期的调用链工作
问题描述
使用带有打字稿的 rxjs 可观察对象来组织调用链的问题
我是 RXJS 的新手,在我的打字稿代码中组织调用链时遇到了一些麻烦。问题是 - 如何制作 this.http.get(' http://www.gooogle.com '); 只调用一次。此代码不是真实的,只是重现的最小情况
import {Injectable} from '@angular/core';
import {flatMap, map} from 'rxjs/operators';
import {Observable, from} from 'rxjs';
import {HttpClient} from '@angular/common/http';
@Injectable()
export class CoolService {
constructor(private http: HttpClient) {}
x(): Observable<Object> {
return from(Promise.resolve({a: {b: 'c'}})).pipe(
flatMap((x) => {
console.log(x);
return this.http.get('http://www.gooogle.com');
}), map((res) => {
console.log(res);
return res;
}));
}
}
解决方案
原因是我不了解 rxjs 运算符的工作原理。所有运营商都在为每个订阅做工作,但我认为它正在为所有订阅做一个计算。因此,我在服务中进行了一系列调用并在不同的地方订阅响应 - 作为一个原因,操作员在代码中运行的次数与订阅一样多,所以我需要重建它
推荐阅读
- ios - Xcode 未检测库..在范围内找不到 Firebase 'FaceDetectorOptions'
- terraform - 为什么在使用 terraform 自动缩放时缩放未创建的矩阵?
- firebase - 在 FirebaseFirestore 上为许多用户获取 postId
- php - 在php中显示数组中的第一张图片
- terraform - 使用模块时无法创建 Terraform 资源组
- reactjs - Electron - Webview 必须附加到 DOM 错误
- javascript - 如何在openpgp JS中将参数消息作为文本传递
- settings - 本地管理员行为/权限 windows server 2019 os
- javascript - Discord.js 更改频道权限无济于事
- python - Python Aiohttp Asyncio:如何在每个任务之间创建延迟