gpt4 book ai didi

angular - 即使来源之一未发出值,RxJS combineLatest

转载 作者:行者123 更新时间:2023-12-03 16:13:27 26 4
gpt4 key购买 nike

我需要将来自两个来源的数据合并为一个 res: {data1: any, data2: any}对象,我需要实现这个 即使其中一个源不发出任何值

这是我期望的结构:

xxx (
source1,
source2,
(data1, data2) => ({data1: data1, data2: data2})
).subscribe(res => {
doSomething1(res.data1)
doSomething2(res.data2)
})

有没有可以做到这一点的 rxjs 运营商?

目前我可以结合 startWith 来解决这个问题和 combineLatest - 我发出空值所以 combineLatest可以开始发出值 - 没有 startWith(null) 的任何更好的方法来解决这个问题?
combineLatest (
source1.pipe(startWith(null)),
source2.pipe(startWith(null)),
(data1, data2) => ({data1: data1, data2: data2})
).subscribe(res => {
if(res.data1) {
doSomething1(res.data1)
}
if(res.data2) {
doSomething2(res.data2)
}
})

最佳答案

正如@ritaj 已经提到的,你似乎已经做得很好了,虽然 :

  • 我会替换 startWithdefaultIfEmpty operator仅当任何可观察对象为空时才继续。这是比较两种方法的大理石图:

  • startWith vs defaultIfEmpty with combineLatest operator

    * 请注意带有 startWith 的流发射两次
  • 使用唯一的对象(或符号)而不是简单的 null ,以防万一源流真的发出 null .这将确保我们只过滤掉我们的标记,而不是真正的结果
  • 使用过滤器代替 if-else在订阅中 - 应该看起来更干净一点。这是保持 .subscribe 的一般良好做法。尽可能薄

  • 这是一个例子:

    const NO_VALUE = {};

    const result$ = combineLatest(
    a$.pipe( defaultIfEmpty(NO_VALUE) ),
    b$.pipe( defaultIfEmpty(NO_VALUE) )
    )
    .pipe(filter(([a, b]) => a !== NO_VALUE || b !== NO_VALUE))

    ^ Run this code with a marble diagram .

    希望这可以帮助

    关于angular - 即使来源之一未发出值,RxJS combineLatest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56036838/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com