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

从可观察数组中获取一个对象

潘弘扬
2023-03-14

如何编写接受Observable 返回Observable 的函数?

getTransactions(): Observable<Transaction[]>{
        ...
    }
getTransaction(id: number): Observable<Transaction>{
    return this.getTransactions().pipe(find(txn => txn.id === id));
}

我得到的错误是类型'Observable'不能分配到类型'Observable'。类型'transaction[]不可分配给类型'transaction'。类型“transaction[]”中缺少属性“id”。

据我所知,可观测管道函数(map、single、find、max等)与数据流有关(即,当可观测器随着时间的推移发出多个项时),当可观测器同时发出单个项(碰巧是一个数组)时,这些函数就不有用了。

编写gettransaction(id)函数的正确方法是什么?我试过:

let transactions : Transaction[] = [];
this.getTransactions().subscribe(txns => transactions=txns);
return of(transactions.find(txn => txn.id === id));

我正在使用:
Angular CLI:6.0.3
Angular:6.0.1
RXJS:6.1.0

共有1个答案

汲昊空
2023-03-14

您需要将可观察值视为数组流,而不是试图将其视为项流。可观察到的值是单个数据点,每个数据点都包含自己的数组。

getTransaction(id: number): Observable<Transaction>{
    return this.getTransactions().pipe(
        map(txs => txs.find(txn => txn.id === id))
    );
}

您在这里所做的是将流中的每个数组映射到具有匹配参数的ID的任何项。

 类似资料:
  • 我有一个方法返回<code>Single 我可以使用,但这不允许我从中返回列表。 我还尝试了。 编辑 我可以通过以下方式完成这项工作: 请告诉 如果这种方式是正确的 我是反应式编程新手,请解释一下。

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 我有一个servers对象数组,其中在数组中有另一个可观察对象数组,其键是[securityGroups]。 我有另一个securitygroupsArray数组,在这里我使用API来获取所有SecurityGroups。 我需要在securityGroups键中查找服务器阵列中该服务器上安全组的所有名称,并在一个选项中只显示我的其他阵列(securityGroupArray)的ngfor的不同名

  • 我对RxJS很陌生,所以如果这个问题已经得到回答,我提前道歉。 我有一个Angular 2应用程序,在其中一个组件中有一个普通对象。我将UI绑定到这个对象。我想做的是能够捕获对这个对象的所有更改,无论它们来自代码还是来自用户更改其中一个字段。 我正在查看可观察对象,但似乎只有通过Emit方法推送新对象时,订阅者才能接收通知。例如,在属性绑定到输入字段的情况下,这将如何工作? 有更好的方法吗? 这是

  • Observables 是多个值的惰性推送集合。它填补了下面表格中的空白: 单个值 多个值 拉取 Function Iterator 推送 Promise Observable 示例 - 当订阅下面代码中的 Observable 的时候会立即(同步地)推送值1、2、3,然后1秒后会推送值4,再然后是完成流: var observable = Rx.Observable.create(functio

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用: