【问题标题】:Observable of array for array of ObservablesObservables 数组的 Observable 数组
【发布时间】:2018-06-06 22:30:19
【问题描述】:

我在我的 Angular4 应用程序中使用 Observables 时遇到以下情况,我无法开始工作:我想为概览页面收集所有预订日的摘要数据。获取所有的日子是一个可观察的,每一天都有一个我必须检索的当天的预订列表 - 再次是一个可观察的来源。从这个列表中,我计算了一天的总结。我想在结果 observable 中发出所有这些摘要。

我尝试了很多更复杂的事情,但总是没有等待完成的内部 observables 并且我得到了空的摘要。我已经回到了基础,这些方面的东西应该可以工作:

getSummaries(): Observable<BookingDaySummary[]> {
    return this.bookingService.getBookingDays().take(1).mergeMap(
        days => this.calculateSummaryOfDays(days)
    )
};

private calculateSummaryOfDays(days: BookingDay[]): Observable<BookingDaySummary[]> {
    const summaries$ = days.map(day => this.calculateSummary(day));
    // I'm aware that the next line is not correct. 
    // Essentially I want the array of observables to complete 
    // and have an array of the resulting values.
    return Observable.merge(summaries$);
}

private calculateSummary(day: BookingDay): Observable<BookingDaySummary> {
    // ... logic to get summary from one day
}

但是,summaries$ 的类型是 Observable&lt;Observable&lt;BookingDaySummary&gt;,而不是 Observable。所以这一切都归结为:我如何从[Observable&lt;T&gt;] 制作Observable&lt;T[]&gt;

另外:当打算生成Observable&lt;T&gt; 时,我在.map 中使用的最内部方法应该返回一个 Observable 还是只是将传入类型映射到 T ?

【问题讨论】:

  • calculateSummary 真的(需要)返回一个 Observable 吗?
  • @IngoBürk:这是问题的一部分。我都试过了。该方法本身使用 Observable(另一个 db 提取),所以我想它必须这样做。

标签: typescript merge rxjs observable


【解决方案1】:

我如何从 Observable[] 中创建一个 Observable

forkJoin 这样做。为你的 T 使用字符串:

import { of, forkJoin} from 'rxjs';
import { Observable } from 'rxjs'

const source:Array<Observable<String>> = [of('A'), of('B'), of('C') ];

const source2:Observable<String[]> = forkJoin(source);

source2.subscribe((res=>console.log(res)));

https://stackblitz.com/edit/arrayofobs2obsofarray?file=index.ts

【讨论】:

    【解决方案2】:

    calculateSummaryOfDays 的最后一条语句中使用 RxJS combineLatest 静态函数:

    return Observable.combineLatest(summaries$);
    

    请注意,您的 summaries$ 是一个可观察的数组:

    const summaries$: Observable<BookingDaySummary>[] = ...
    

    来自combineLatest documentation

    组合多个 Observable 以创建一个 Observable,其值是根据其每个输入 Observable 的最新值计算得出的。

    combineLatest 的静态版本接受 Observable 数组或每个 Observable 可以直接作为参数。

    因此,此函数将获取您的 observable 数组并返回一个数组的 observable。

    【讨论】:

    • 作为对这个答案的评论:“如果您正在使用只发出一个值的可观察对象,或者您只需要完成之前每个值的最后一个值,那么 forkJoin 可能是一个更好的选择。 "(直接引用文档here
    【解决方案3】:

    试试

    return Observable.from(summaries$).mergeMap(value=>value);
    

    我想摘要是一个可观察的数组 - Observable[] 使用 Observable.from 会一一发出它们,然后用 mergeMap 将 Observable 展平并执行,最后你会得到纯值发射。

    【讨论】:

    • Observable&lt;BookingDaySummary&gt; is notassignable to type Observable&lt;BookingdaySummary[]&gt; 当我尝试你的建议时发生。
    • 将您的输入从 Observable 更改为 Observable 或仅使用 看看它是否首先工作
    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 2023-04-09
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多