【问题标题】:forkjoin not wait for all observables complete when no value emit from each observable当每个可观察对象没有发出任何值时,forkjoin 不会等待所有可观察对象完成
【发布时间】:2019-03-01 21:57:24
【问题描述】:

我有几个 observables 请求。 每个 observable 请求都是递归调用,当没有更多数据时,它会调用 EMPTY。

例如:

request1 = recursive observable call
request2 = recursive observable call
request3 = recursive observable call

然后我用forJoin

forJoin(request, request2, request3).subscribe();

当其中任何一个完成时,forkJoin 将完成回调。它实际上并没有等待所有可观察对象完成。 我检查了 rxjs 文档,它提到了

当所有 observables 完成后,发出每个 observables 最后发出的值。

因为我不关心这些可观察对象的返回值,所以它不会向 forkJoin 观察者发出值。然后我发现在这种情况下,如果只有一个完整的,forkJoin 观察者会收到完整的通知。

这是我确实需要发出值才能等待所有可观察对象完成的可观察限制吗?

非常感谢。

【问题讨论】:

  • 实际上你需要什么行为非常令人困惑。 forkJoin 不会完成,除非所有源 Observable 发出至少一个值。如果一个源刚刚完成并且没有发出任何内容,forkJoin 将永远不会完成。
  • 在我的测试中,当一个发射完成时,forkJoin 实际上完成了。最后我解决了在完成之前发出一个值。
  • 您可以只返回 of(true) 而不是 EMPTY,这将用一个值完成流。

标签: rxjs observable rxjs6


【解决方案1】:

by design

参考here

forkJoin 如果其中一个流完成但没有发出值,则短路。

由于EMPTY 只是发出“完成”而不是其他任何东西,forkJoin 将在此处完成。

实际上,forkJoin 中的其他非空 observables 仍然会被订阅,但是由于 forkJoin 可能在它们之前完成(取决于 EMPTY 何时出现在 forkJoin 中),您可能无法在forkJoincomplete 函数中处理它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多