我向服务器发出请求,并得到可观察到的响应。在数据内部,我有一个ID,它引用另一个文档,我需要发送另一个请求来获取数据,并将其附加到父对象的数据中。如何做到这一点?
有了Promise,我可以使用async/await来实现这一点,但我想知道如何使用Observable来实现这一点
promise样品
async func_name() {
let data1 = await <first_server_call_returns_promise>();
let data2 = await <second_call_with_data1.id_returns_promise>();
data1.value = data2;
return data1;
}
如何实现上述与观察?
编辑1
基于@Teddesterne回复,我写的代码如下,但我在订阅中得到的是一个可观察的数据,而不是阻止我将可观察的数据分配给html的实际数据
this.blogDoc.snapshotChanges().pipe(
exhaustMap((blogs) => {
return blogs.map(blog => {
const data = blog.payload.doc.data();
const id = blog.payload.doc.id;
return this.userService.getUserById(data.uid).pipe(
map((user) => {
const name = user.name;
return { id, name, ...data}
}),
)
})
}),
)
.subscribe(finalData => {
finalData.subscribe(data => console.log(data));
});
编辑2
下面是我现在拥有的更新代码
this.blogDoc.snapshotChanges().pipe(
exhaustMap((blogs: any[]) => {
return zip(blogs.map((blog) => {
const data = blog.payload.doc.data();
const id = blog.payload.doc.id;
console.log(data);
return this.userService.getUserById(data.uid).pipe(
map((value) => {
console.log(value);
return value;
})
)
})).pipe(first())
})
).subscribe(values => console.log("Values: ", values));
控制台。日志(数据)
正确打印数据,但控制台。日志(值)
未打印,控制台也未打印。日志(“值:”,值)
当我使用订阅this.userervice.getUserById(data.uid)时,它返回预期的单个用户文档。
我错过了什么?
我尝试了上面的代码,但我在fullQualifiedData中得到的是另一个可观察的,我不能直接在html文件中的*ngFor上使用。
角度文档中也讨论了这一点,但基本上有两种解决方案:
async
管道将为您订阅可观察的,然后提供数据。这很容易使用,但是请注意,每个async
管道都会创建一个新的订阅,在HTTP请求的情况下,这可能意味着多次触发该请求。所以要小心使用。
js prettyprint-override">@Component({ … })
export class YourComponent {
public data$ = this.http.getFoo();
constructor(private http: Http) {}
}
<ng-container *ngIf="data$ | async as data">
{{ data.foobar }}
</ng-container>
@Component({ … })
export class YourComponent implements OnInit {
public data: Data;
constructor(private http: Http) {}
public ngOnInit() {
this.http.getFoo().subscribe(data => this.data = data);
}
}
{{ data?.foobar }}
或者
<ng-container *ngIf="data">
{{ data.foobar }}
</ng-container>
您可以使用defaustmap
将数据传输到第二个http调用,然后在返回时将数据合并在一起。
import { zip } from 'rxjs/observable/zip';
this.http.get('/data1').pipe(
exhaustMap((data1Arr: any[]) => {
return zip(...data1Arr.map((data1) => {
return this.http.get('/data2/' + data1.id).pipe(
map((data2) => {
data1.value = data2;
return data1;
}),
);
}).pipe(first());
}),
).subscribe((fullQualifiedData) => {
// do stuff with the data
});
我正在尝试实现一个基于Californium的CoAP客户端。我让这个客户观察一个资源: 我想从另一个类访问值“val”。我该怎么做?我尝试像这样从CoapCl类调用引用并打印出值: 这将打印我从CoAP客户端获得的所有值,包括已更改和未更改的值。如果只想得到改变后的值,该怎么办?
我有一个带有http请求的服务,它返回我的标题的可观察到的内容 servise.ts 在我的组件中,我有一个函数从service get Request设置。看起来是这样的: 问题是,有时我接收到带有空标签的标题,不需要显示它们,所以我需要对其进行过滤,并对此标题发送.delete()请求。我尝试了类似的方法(想法是在之前添加,然后在另一个subscribe内部调用。)差不多吧 但不确定这是不是个
我正在将angular 2组件转换为使用异步数据源。 我有一个<代码> 这会导致错误: 找不到类型为“object”的不同支持对象“[object]”。NgFor只支持绑定到数组之类的可重用文件。 我试过
在我的应用程序中,我一直在努力进行一些基本的更改检测。我已经这样做了几天了,而且失去了意志!我想知道这里是否有人能给我指出正确的方向。 我有一个和2个列表。一个是给,另一个是给。 此方法连接到数据库以获取对象列表,每个对象都有一个值。现在我想使用这些键去获取每个用户的实际。我什么都试过了,似乎是我唯一能工作的东西。 因此,两者都调用函数,我在模板上使用管道。 我的函数是这样的。 但是,Angula
问题内容: 如何在没有root特权的情况下检测到chroot监狱?假设一个标准的BSD或Linux系统。我想到的最好的办法是查看“ /”的inode值,并考虑它是否相当低,但是我想使用一种更准确的检测方法。 仅浏览文件系统是不够的,因为复制/ boot和/ dev之类的东西来欺骗被监禁的用户并不困难。 对于Linux系统,检查/ proc中的意外值是合理的,但是首先不支持/ proc的系统呢? 问
我有一个可观察的对象,它从数据库游标的快速流中生成数据。我希望以每秒x项的速度限制输出。到目前为止,我一直在使用文档中所述的调用堆栈阻塞: 这很好,但出于好奇,是否有更好的方法使用背压来处理此问题? Tks公司