当前位置: 首页 > 知识库问答 >
问题:

检索可观测内部的值

谢奇略
2023-03-14

我向服务器发出请求,并得到可观察到的响应。在数据内部,我有一个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)时,它返回预期的单个用户文档。

我错过了什么?

共有2个答案

曹季同
2023-03-14

我尝试了上面的代码,但我在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>
曹高阳
2023-03-14

您可以使用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公司