从可观察数组中获取一个值

Bob*_*ose 4 observable rxjs angular

你如何编写一个带有Observable<T[]>和返回的函数Observable<T>

例如,我有两种方法:

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

我得到的错误是'Observable'类型不能分配给'Observable'类型.类型'Transaction []不能分配给'Transaction'类型."交易[]"类型中缺少属性"id".

据我所知,可观察管道函数(map,single,find,max等)属于数据流(即,当observable随时间发出多个项目时),当observable发出单个项目时,它们无用(这恰好是一个数组)立刻.

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

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

但这会导致错误,说"事务"未定义.我对Angular等很新,所以任何指令都很有帮助.谢谢!

Stackblitz

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

bry*_*n60 6

您需要将可观察值视为数组流,而不是尝试将其视为项目流流.您的observable中的值是单个数据点,每个数据点都包含自己的数组.

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

你在这里做的是将流中的每个数组映射到具有与参数匹配的ID的任何项目.

  • find应该只是返回对象,而不是副本。但是,一般情况下,依靠引用进行对象变异是不明智的做法,并且会导致难以理解和维护代码。最好不要变异并且总是显式更新。 (2认同)