我如何理解服务中的 toSignal(x) 取消订阅的情况

问题描述 投票:0回答:1

private xSubject = new BehaviorSubject<any[]>([]);  

public $x = this.xSubject.asObservable();  

 public xSignal = toSignal(this.xSubject, { requireSync: true });

我需要使用信号,但我不太确定与 http 和反应式上下文一起使用

angular rxjs signals
1个回答
0
投票

TLDR;当服务被销毁时,订阅将被取消订阅

来自源代码to_signal.ts

当我们使用 toSignal 时。在内部,它获取您正在使用它的服务/组件的 destroyRef 注入器。

const cleanupRef = requiresCleanup
    ? options?.injector?.get(DestroyRef) ?? inject(DestroyRef)
    : null;

记住注入只能在组件的根级别使用,不能在钩子或函数内部使用,因此使用注入是我们不能在函数或钩子内部使用信号的原因。

在文档中 destroyRef

DestroyRef 允许您设置回调以运行任何清理或销毁行为。此销毁的范围取决于 DestroyRef 注入的位置。如果 DestroyRef 被注入到组件或指令中,则回调将在该组件或指令被销毁时运行。否则,当相应的注入器被销毁时,回调将运行。

获取此信息后,他们会在

onDestroy
回调中调用取消订阅

// Unsubscribe when the current context is destroyed, if requested.
cleanupRef?.onDestroy(sub.unsubscribe.bind(sub));

总而言之,当组件/服务被销毁时,toSignal 就会被取消订阅。

除此之外,您还有其他两个选择。

/**
   * `Injector` which will provide the `DestroyRef` used to clean up the Observable subscription.
   *
   * If this is not provided, a `DestroyRef` will be retrieved from the current [injection
   * context](guide/di/dependency-injection-context), unless manual cleanup is requested.
   */
  injector?: Injector;

  /**
   * Whether the subscription should be automatically cleaned up (via `DestroyRef`) when
   * `toSignal`'s creation context is destroyed.
   *
   * If manual cleanup is enabled, then `DestroyRef` is not used, and the subscription will persist
   * until the `Observable` itself completes.
   */
  manualCleanup?: boolean;
© www.soinside.com 2019 - 2024. All rights reserved.