空のObservableを返す


167

関数more()Observablegetリクエストからを返すことになっています

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()function subscribe is not definedでエラーが発生します。空のオブザーバブルを返すにはどうすればよいですか?

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

更新

RXJS 6の場合

import { EMPTY } from 'rxjs'

return EMPTY; 

回答:


130

typescriptの場合、次のように空のオブザーバブルの汎用パラメーターを指定できます。

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

26
これは今import "EmptyObservable" from "rxjs/observable/EmptyObservable";、であるはずnew EmptyObservable<Response>();です。

87

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({})作成し、Observable次の値の{}を発行してから、を完成させObservableます。

例えば:

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();


1
of('foo')オブザーバブルをすぐに放出して完了します。rxviz.com/v/0oqMVW1o
SimplGy

@SimplGyはいあなたは正しいtake(1)です、より良い答えのために削除を使用するのは私の悪いです。@MatthijsWessels、はい、いいえ、これをテストしました。そうすると、of()完全なオブザーバブルを放出せずに返しますnext
Stephen Lautier

emptyは廃止されました。代わりにEMPTYを使用してください(メソッドとしてではなく定数として使用されます。Simon_Weaverによる回答を参照してください)。
EriF89

of()は値を発行しないことに注意してください。必要な場合は、値を指定する必要があります。未定義でもnullでも構いません。of(null)は値(およびタップ/サブスクライブメソッドでのプロセス)を発行しますが、of()は発行しません。
Maxim Georgievskiy

51

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

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

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

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

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



次のような競合がある場合はempty()機能を、すでにあなたが言うことができるimport { empty as rxEmpty }import { empty as _empty }、次にやりますrxEmpty()_empty()。もちろん、これはかなり標準的ではないことであり、実際には推奨していませんが、RxJSが名前空間ofなどemptyに関数をインポートする価値があると考えていることに驚いたのは私だけではありません!
Simon_Weaver 2018年

1
Angularを使用する場合は注意が必要import { EMPTY } from "@angular/core/src/render3/definition";です。したがって、奇妙なエラーが発生した場合は、誤ってインポートしていないことを確認してください。
Simon_Weaver

Observable.empty()実際にはまだ存在しますが、非推奨になりましたEMPTY
Alexander Abakumov

39

私の場合、Angular2とrxjsでは、次のように動作しました。

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

7
含むimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare 2017年

このようなエラーが発生した場合、system-configで何かを設定する必要がありますか?未処理のPromise拒否:localhost:9190 / node_modules / rxjs / Observable / EmptyObservable.jsを読み込む(SystemJS)XHRエラー(404が見つかりません)エラー:localhost:9190 / node_modules / rxjs / Observable / EmptyObservableを読み込む XHRエラー(404が見つかりません)。 js
user630209 2017

29

はい、空の演算子があります

Rx.Observable.empty();

typescriptの場合、次を使用できますfrom

Rx.Observable<Response>.from([])

私はにRx.Observable<{}>割り当て可能ではありませんObservable<Response>、私は試しましたRx.Observable<Response>.empty()が、うまく
いき

戻り値の型をに変更しましたが、Observable<any>うまくいきました。
Murhaf Sousli

2
それはRx.Observable.from([])ないはず<Response>です。そうでない場合、「式が予期されています」というエラーが発生します。
Andriy Tolstoy

2
も使用できますRx.Observable.of([])
Andriy Tolstoy

1
@AndriyTolstoyこれが同等かどうかはわかりません。ではObservable.of([])、1つの値が出力され([])、ストリームが完了します。を使用するObservable.from([])と、値は出力されず、ストリームはすぐに完了します。
Pac0

24

空の監視可能オブジェクトを作成するいくつかの方法:

それらは、あなたがそれをさらにどのように使用するか(それがどのイベントを出力するか:nextcompleteまたはdo nothing)が異なるだけです。例:

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

あなたの正確なニーズにそれを使用してください)


13

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

Observable.of('');

// or
Observable.of({});

// etc


1

RxJS 6

以下のような関数からも使用できます:

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

インポート後:

import {from} from 'rxjs';

2
これにより、1つの要素(空の文字列)を提供するObservableが作成されるため、この特定の質問に対する適切な回答のようには見えません。
BrunoJCM 2018年

1

同様の質問でここに来た、上記は私にとってはうまく"rxjs": "^6.0.0"いきませんでした:私がする必要のあるデータを放出しないオブザーバブルを生成するために:

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

0

これを試して

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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.