first()オペランドは、関数内での2回目の呼び出し後に公開されません

ニカ

これが機能しない理由はわかりませんが、以下の代替方法は機能します。

app.component.ts

import { Component } from '@angular/core';
import { Subject, Observable } from 'rxjs';
import { first } from 'rxjs/operators';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  id = 0;
  obs = new Subject();

  changeValue() {
    this.fakeApiCall(this.id++)
      .pipe(first())
      .subscribe(this.obs);
  }

  fakeApiCall(id: number) {
    return new Observable(observer => {
      console.log('called with id ' + id);
      observer.next({ items: [id, Math.random()] });
    });
  }
}

app.component.html

<h1>
    <div *ngIf="(obs | async) as v">
        <ul>
            <li *ngFor="let item of v.items">
                {{ item }}
            </li>
        </ul>

        <ul>
            <li *ngFor="let item of v.items">
                {{ item }}
            </li>
        </ul>
    </div>

    <div *ngIf="(obs | async) as v">
        <ul>
            <li *ngFor="let item of v.items">
                {{ item }}
            </li>
        </ul>

        <ul>
            <li *ngFor="let item of v.items">
                {{ item }}
            </li>
        </ul>
    </div>

    <button (click)="changeValue()">increase counter</button>
</h1>

「カウンターを増やす」ボタンをクリックすると、最初に値が取得されますが、その後は取得されませんが、これらの選択肢は問題なく機能します。

changeValue() {
    this.fakeApiCall(this.id++)
      .subscribe(this.obs)
      .unsubscribe();
  }

または

changeValue() {
    this.fakeApiCall(this.id++)
      .pipe(take(2)) // NOTES: if I write take(1), it has the same effect.
      .subscribe(this.obs);
  }

これはバグなのか、それともここで実際に何が起こっているのか、私は混乱しています。

編集:stackblitzのURLが必要な場合は、https://stackblitz.com/edit/angular-28eyiy

マーティン

これは、問題は、あなたが加入している方法である、バグではありませんSubjectsubscribe(this.obs)

使用subscribe(this.obs)すると、すべての通知がSubjectインスタンスに渡されますこの手段nextcompleteおよびerror通知。そして、ここに問題がありfirst()ます。最初の放出の後にチェーンを完了します(ところで、RxJSを使用したAngular 2を参照-take(1)vs first())。これはnext、1つと1つのcomplete通知を渡すことを意味しますときは、Subject受信complete通知、あなたが別のチェーンに再びそれをサブスクライブしても、その停止となります決して再放出何も(これはの一部である「観察可能な契約」)。

したがってSubject、複数のサブスクリプションで同じものを使用して、それらが完了することがわかっている場合は、next通知のみを渡すことができ、それ以上Subject何も渡すことができません(アクティブのままになります)。

.subscribe(v => this.obs.next(v));

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ghciの `trace`関数は2回目の呼び出しで出力されません

分類Dev

私の角度関数は最初の呼び出しで実行されていません。2回目の呼び出しでのみ実行されます

分類Dev

関数は2回目の呼び出しでログオンします

分類Dev

ajax 2回目の呼び出し:関数は関数エラーではありません

分類Dev

値レシーバーを持つ関数への関数ポインターであるGolangは、2回目に呼び出されたときに、変更されたレシーバーでその関数を呼び出しません

分類Dev

setIntervalは2回目の呼び出し後に停止しません

分類Dev

tween.addEventListenerは、2回目に呼び出されたときに関数ではありません

分類Dev

JavaScriptのfadeOut関数は2回目の呼び出しでは機能しません

分類Dev

gridlayoutオプションでのデータの設定は、2回目の呼び出し後に機能しません

分類Dev

NSNotificationCenterスレッドは、削除された後でも2回目の呼び出しで中断します

分類Dev

2回目の検証でMoqの呼び出しは実行されません

分類Dev

DatePickerのsetMinDate(...)は、2回目に呼び出されたときに機能しません

分類Dev

FirebaseのJavaScript変数は、呼び出された2回目の関数でのみ表示されます

分類Dev

自分自身を呼び出すオプションの完了ハンドラーを使用して反復し、2回目は完了しません

分類Dev

LoggingFactoryは2回目の呼び出しで破棄されました

分類Dev

スクリプトは、シーンがリロードされた後もVector2値を保持します。Awake()またはStart()関数での新しいX、Y値の設定は、2回目のロード後に機能しません

分類Dev

クリックイベントリスナーによって呼び出された関数は、クリックせずに呼び出されますが、2回目の実行時にのみ呼び出されます

分類Dev

Swift ios didSelectItemAtは、2回目のクリックまで呼び出されません

分類Dev

Javascript関数は、2回目の呼び出し時に、古い呼び出しを繰り返します

分類Dev

ASIO io_serviceは、2回目のrun()呼び出しでポストハンドラーを処理しません

分類Dev

エラー/成功メッセージアラートは、jqueryでページを再度更新しないと2回目のajax呼び出しに表示されません

分類Dev

2回目の追加呼び出しまで<li>内に画像が表示されない

分類Dev

ReactJSのボタンは、2回目のクリック後にのみ関数を呼び出し、最初のクリック後は効果がありません

分類Dev

2回目のajax呼び出し後に値が更新されない

分類Dev

2回目の呼び出し後にJsonStringが表示されない

分類Dev

3回目の呼び出しの後、関数は完全に機能します[Google Charts]

分類Dev

コンストラクターが2回目に呼び出されないのはなぜですか?

分類Dev

React Refオブジェクトは、2回目の呼び出し後に自動的にリセットされます

分類Dev

分度器からブラウザログを読み取ると、2回目の呼び出し後に結果が得られません

Related 関連記事

  1. 1

    ghciの `trace`関数は2回目の呼び出しで出力されません

  2. 2

    私の角度関数は最初の呼び出しで実行されていません。2回目の呼び出しでのみ実行されます

  3. 3

    関数は2回目の呼び出しでログオンします

  4. 4

    ajax 2回目の呼び出し:関数は関数エラーではありません

  5. 5

    値レシーバーを持つ関数への関数ポインターであるGolangは、2回目に呼び出されたときに、変更されたレシーバーでその関数を呼び出しません

  6. 6

    setIntervalは2回目の呼び出し後に停止しません

  7. 7

    tween.addEventListenerは、2回目に呼び出されたときに関数ではありません

  8. 8

    JavaScriptのfadeOut関数は2回目の呼び出しでは機能しません

  9. 9

    gridlayoutオプションでのデータの設定は、2回目の呼び出し後に機能しません

  10. 10

    NSNotificationCenterスレッドは、削除された後でも2回目の呼び出しで中断します

  11. 11

    2回目の検証でMoqの呼び出しは実行されません

  12. 12

    DatePickerのsetMinDate(...)は、2回目に呼び出されたときに機能しません

  13. 13

    FirebaseのJavaScript変数は、呼び出された2回目の関数でのみ表示されます

  14. 14

    自分自身を呼び出すオプションの完了ハンドラーを使用して反復し、2回目は完了しません

  15. 15

    LoggingFactoryは2回目の呼び出しで破棄されました

  16. 16

    スクリプトは、シーンがリロードされた後もVector2値を保持します。Awake()またはStart()関数での新しいX、Y値の設定は、2回目のロード後に機能しません

  17. 17

    クリックイベントリスナーによって呼び出された関数は、クリックせずに呼び出されますが、2回目の実行時にのみ呼び出されます

  18. 18

    Swift ios didSelectItemAtは、2回目のクリックまで呼び出されません

  19. 19

    Javascript関数は、2回目の呼び出し時に、古い呼び出しを繰り返します

  20. 20

    ASIO io_serviceは、2回目のrun()呼び出しでポストハンドラーを処理しません

  21. 21

    エラー/成功メッセージアラートは、jqueryでページを再度更新しないと2回目のajax呼び出しに表示されません

  22. 22

    2回目の追加呼び出しまで<li>内に画像が表示されない

  23. 23

    ReactJSのボタンは、2回目のクリック後にのみ関数を呼び出し、最初のクリック後は効果がありません

  24. 24

    2回目のajax呼び出し後に値が更新されない

  25. 25

    2回目の呼び出し後にJsonStringが表示されない

  26. 26

    3回目の呼び出しの後、関数は完全に機能します[Google Charts]

  27. 27

    コンストラクターが2回目に呼び出されないのはなぜですか?

  28. 28

    React Refオブジェクトは、2回目の呼び出し後に自動的にリセットされます

  29. 29

    分度器からブラウザログを読み取ると、2回目の呼び出し後に結果が得られません

ホットタグ

アーカイブ