関数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;
TypeScriptの場合、空の観測量の総称パラメータを次のように指定できます。
import 'rxjs/add/observable/empty'
Observable.empty<Response>();
新しい構文では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();
Angular 2とrxjsを使った私の場合は、次のもので動作しました。
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
EMPTY
定数とempty
関数があります。
import { Observable, empty, of } from 'rxjs';
var delay = empty().pipe(delay(1000));
var delay2 = EMPTY.pipe(delay(1000));
Observable.empty()
はもう存在しません。
空の観測量を作成するいくつかの方法:
それらは、あなたがそれをさらに使用しようとしている方法(next
、complete
またはdo nothing
の後にどのイベントが発生するか)が異なるだけです。
Observable.never()
- イベントを発行せず、終了しません。Observable.empty()
- complete
のみを出力します。Observable.of({})
- next
とcomplete
の両方を出力します(空のオブジェクトリテラルを例として渡します)。あなたの正確なニーズに合わせて使ってください)
たとえば、Observable.of(empty_variable)を返すことができます。
Observable.of('');
// or
Observable.of({});
// etc
それともignoreElements()
も試すことができます
RxJS 6
あなたは以下のような機能からも使うことができます:
return from<string>([""]);
インポート後:
import {from} from 'rxjs';
これを試して
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();
"rxjs": "^6.0.0"
では、私がする必要のあるデータを何も放出しないオブザーバブルを生成するために、同様の質問をしました。
import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
params: Observable<any> = empty();
}