gpt4 book ai didi

rxjs - 为什么在 RxJS 中取消了 finalize?

转载 作者:行者123 更新时间:2023-12-04 01:18:23 26 4
gpt4 key购买 nike

我无法理解 RxJS 中的 finalize 运算符。让我用一个例子来证明这一点:

of(null).pipe(
tap({ complete: () => console.log('tap 1 completes') }),
finalize(() => console.log('finalize')),
tap({ complete: () => console.log('tap 2 completes') })
).subscribe({ complete: () => console.log('subscribe completes') });
我希望 finalize 回调在第二个 tap 之前执行。然而,这并没有发生。而是上面的代码产生以下输出:
tap 1 completes
tap 2 completes
subscribe completes
finalize
看着 implementation 我相信操作符是通过(提升)整个可观察链的,总是在它的末尾应用。所以现在我最终有两个问题:
  • 这个设计决定背后的基本原理是什么?你能解释一下为什么这是一个理想的/有利的属性(property)吗?
  • 是否有不同的运算符或其他解决方案可以在完成和出错时执行代码,但按顺序(即在上述示例中的第二个 tap 之前)而不是在可观察链的末尾?
  • 最佳答案

    请务必注意 finalize()tap() 的工作方式非常不同。 tap()nexterrorcomplete 通知触发,而 finalize() 仅在链订阅时触发。换句话说 finalize() 非常类似于使用:

    const subscription = $source.subscribe();
    // This will be always triggered after all `tap()`s
    subscription.add(() => console.log('same as finalize()'));
    所以你不能在 finalize() 之前调用 tap() 。另外,请注意,当您手动取消订阅以下内容时,也会调用 finalize():
    subscription.unsubscribe(); // will always invoke `finalize()` but never `tap()`
    一种可能的解决方案可能是实现你自己的 finalize() 变体,它知道它被调用的原因: https://github.com/martinsik/rxjs-extra/blob/master/doc/finalizeWithReason.md (see source code)
    另请注意, https://github.com/ReactiveX/rxjs/pull/5433 不会影响您的用例。

    关于rxjs - 为什么在 RxJS 中取消了 finalize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62959937/

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