web-dev-qa-db-ja.com

空の観測量を返す

関数more()は、getリクエストからObservableを返すはずです。

export class Collection{

    public more = (): Observable<Response> => {
       if (this.hasMore()) {

         return this.fetch();
       }
       else{
         // return empty observable
       }
    }

    private fetch = (): Observable<Response> => {
       return this.http.get('some-url').map(
          (res) => {
              return res.json();
          }
       );
    }
}

この場合、hasMore()がtrueの場合にのみリクエストを行うことができますが、そうでなければsubscribe()関数subscribe is not definedでエラーが発生します。

this.collection.more().subscribe(
   (res) =>{
       console.log(res);
   },
   (err) =>{
       console.log(err);
   }
)

更新

RXJS 6では

import { EMPTY } from 'rxjs'

return EMPTY; 
112
Murhaf Sousli

TypeScriptの場合、空の観測量の総称パラメータを次のように指定できます。

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
104
Andrei Petrov

新しい構文ではrxjs 5.5以降、これは次のようになります。

// rxjs 6
import { empty, of } from "rxjs";

// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";

empty();
of({});

覚えておくべきことが1つだけあります。empty()は監視可能オブジェクトを完成させるので、ストリーム内でnextがトリガーされることはなく、完成するだけです。あなたが例えばtapを持っているなら、彼らはあなたが望むようにトリガーを得ないかもしれません(下記の例を見てください)。

一方、of({})はオブザーバブルを作成し、次に{}の値でnextを発行してからオブザーバブルを完成させます。

例えば.

empty().pipe(
    tap(() => console.warn("i will not reach here, as i am complete"))
).subscribe();

of({}).pipe(
    tap(() => console.warn("i will reach here and complete"))
).subscribe();
49
Stephen Lautier

Angular 2とrxjsを使った私の場合は、次のもので動作しました。

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
35
Marcel Tinner

RxJS6(互換性パッケージがインストールされていない場合)

EMPTY定数とempty関数があります。

  import { Observable, empty, of } from 'rxjs';

  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty()はもう存在しません。

31
Simon_Weaver

はい、あります 演算子

Rx.Observable.empty();

TypeScriptの場合は、fromを使用できます。

Rx.Observable<Response>.from([])
28
Toan Nguyen

空の観測量を作成するいくつかの方法:

それらは、あなたがそれをさらに使用しようとしている方法(nextcompleteまたはdo nothingの後にどのイベントが発生するか)が異なるだけです。

  • Observable.never() - イベントを発行せず、終了しません。
  • Observable.empty() - completeのみを出力します。
  • Observable.of({}) - nextcompleteの両方を出力します(空のオブジェクトリテラルを例として渡します)。

あなたの正確なニーズに合わせて使ってください)

14

たとえば、Observable.of(empty_variable)を返すことができます。

Observable.of('');

// or
Observable.of({});

// etc
10
Chybie

それともignoreElements()も試すことができます

2
Tuong Le

RxJS 6

あなたは以下のような機能からも使うことができます:

return from<string>([""]);

インポート後:

import {from} from 'rxjs';
0
Nour

これを試して

export class Collection{
public more (): Observable<Response> {
   if (this.hasMore()) {
     return this.fetch();
   }
   else{
     return this.returnEmpty(); 
   }            
  }
public returnEmpty(): any {
    let subscription = source.subscribe(
      function (x) {
       console.log('Next: %s', x);
    },
    function (err) {
       console.log('Error: %s', err);
    },
    function () {
       console.log('Completed');
    });
    }
  }
let source = Observable.empty();
0
Jorawar Singh

"rxjs": "^6.0.0"では、私がする必要のあるデータを何も放出しないオブザーバブルを生成するために、同様の質問をしました。

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}
0
Callat