web-dev-qa-db-ja.com

コンポーネント内で使用できる非同期パイプに相当するものはありますか?

このようなコンポーネント内で使用できるasyncパイプに相当するものはありますか?

   @Component({
      selector: 'my-component',
    })

    export class myComponent {

      myObservable$: Observable<string>;

      method() {
        doSomething(this.myObservable$);
        // here I would like to access directly the current string value of
        // myObservable$ without having to subscribe 
      }
    }
12
Lev

自問する必要があります。subscribe()呼び出しを回避することで何を達成したいですか?私の推測では、サブスクリプションを維持したり、手動でサブスクリプションを解除したりすることを防ぎたいと思います。

この場合は、完了したObservableを取得することを確認する必要があります。その後、退会する必要はありません。 Observable(有限または無限)を最終的に完了するものに変換できます。

これがあなたのケースの例です:

  method() {
    this.myObservable$.take(1).subscribe(
      val => doSomething(val)
    );
  }

正しい方法は、実際には、オブザーバブルが何をするか、そしてその値で何をしたいかによって異なります。 Angular2 http呼び出しは、たとえば、それ自体で完了します 購読を解除する必要はありません

または、オブザーバブルのすべての新しい値に対してdoSomethingを呼び出したい場合は、最初の値のみを取得してからオブザーバブルが完了するため、上記のソリューションは適合しません。私が言ったように、これは問題の文脈に帰着します。

5
magnattic

ComponentまたはChangeDetectorRefにアクセスできる場所にいる場合は、次の小さなトリックを実行できます。

@Component({
...
  providers: [AsyncPipe]
})
export class ExampleComponent {
  app$ = this.sandbox.allApps$;
  apps = this.pipeAsync.transform(this.app$);

  contructor(
    protected pipeAsync: AsyncPipe,
    protected sandbox: AppAppsSandbox
  ) {}
}

これは、AppAppsSandboxというサービスへのアクセスを前提としていますが、Observableapp$どこからでもアクセスできます。これは、ラップを解除するのに便利な方法です。

1
rivanov

(サブスクリプションを使用せずに)目標を達成できる唯一の方法は、BehaviorSubjectを使用することです。これには、メソッドgetValue()があります。 ObservablesとBehaviousSubjectsの間にはいくつかの違いがあります(それらは documentation にあります)。

var subject = new Rx.BehaviorSubject(current_subject_value);
subject.getValue()

それでも、getValueメソッドを使用するのではなく、サブスクリプションを使用する必要がある理由について、いくつかのスタックオーバーフローの議論があります...それでも、監視可能なシーケンスを完了する監視可能なテイク演算子があります(したがって、サブスクリプションを管理する必要はありません)

this.myObservable$.take(1).subscribe()
0
Timothy