Boş bir Gözlenebilir geri dön


167

İşlevin get isteğinden more()döndürmesi gerekiyorObservable

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

Bu durumda, yalnızca hasMore()doğru olduğunda bir istekte bulunabilirim , aksi takdirde subscribe()işlevde bir hata alıyorum, subscribe is not definedboş bir gözlemlenebilir nasıl döndürebilirim?

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

Güncelleme

RXJS 6'da

import { EMPTY } from 'rxjs'

return EMPTY; 

Yanıtlar:


130

Daktilo için boş gözlemlenebilirinizin genel parametresini şu şekilde belirleyebilirsiniz:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

26
Bu artık olmalı import "EmptyObservable" from "rxjs/observable/EmptyObservable";, sonra new EmptyObservable<Response>();.

87

Yeni RxJS 5.5+ sözdizimi ile bu şöyle olur:

// 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({});

Akılda tutulması gereken bir şey empty(), gözlemlenebilir olanı tamamlar, böylece nextakışınızda tetiklenmez , ancak yalnızca tamamlanır. Dolayısıyla, örneğin, tapistediğiniz gibi tetiklenmeyebilirler (aşağıdaki örneğe bakın).

Halbuki bir değer of({})yaratır Observableve bir sonraki değer ile yayar {}ve sonra tamamlar Observable.

Örneğin:

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')hemen gözlemlenebilir olanı yayar ve tamamlar. rxviz.com/v/0oqMVW1o
SimplGy

@SimplGy evet haklısın, take(1)daha iyi bir cevap için kullanmaktan kötüyüm . @MatthijsWessels, evet ve hayır, bunu şimdi test ettiniz ve eğer yaymazsanız of()tam bir gözlemlenebilir döneceksiniznext
Stephen Lautier

blank artık kullanımdan kaldırılmıştır, bunun yerine EMPTY kullanın (yöntem yerine sabit olarak kullanılır, bkz. Simon_Weaver'ın yanıtı).
EriF89

Unutmayın, () herhangi bir değer yaymaz. İsterseniz, herhangi bir değer sağlamalısınız, tanımsız veya null bile bunun için iyi olabilir: of (null) değeri yayar (ve dokun / abone ol yöntemleriyle işler), () ise.
Maxim Georgievskiy

51

RxJS6 (uyumluluk paketi kurulu olmadan)

Şimdi bir EMPTYsabit ve bir emptyfonksiyon var.

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

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

Observable.empty() artık mevcut değil.



empty()Zaten bir işlev gibi bir çakışma varsa, söyleyebilir import { empty as rxEmpty }veya import { empty as _empty }sonra rxEmpty()veya yapabilirsiniz _empty(). Yapmak için oldukça standart olmayan şey Elbette ve aslında bunu tavsiye etmiyorum, ama emin ı RxJS şaşırttı o gibi işlevleri ithal layık olduğunu düşünür oldu tek değilim değilim ofve emptybenim ad içine!
Simon_Weaver

1
Eğer açısal kullanıyorsanız dikkatli olun çünkü import { EMPTY } from "@angular/core/src/render3/definition";tamamen istediğiniz şey de yok. Bu nedenle, garip hatalar alıyorsanız, yanlışlıkla içe aktarmadığınızdan emin olun.
Simon_Weaver

Observable.empty()aslında hala var ama lehine reddedildi EMPTY.
Alexander Abakumov

39

Angular2 ve rxjs ile benim durumumda, ile çalıştı:

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

7
dahil etimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare

böyle bir hata alıyorum, sistem-config bir şey yapılandırmak gerekiyor mu? İşlenmemiş Promise reddi: (SystemJS) XHR hatası (404 Bulunamadı) localhost yükleniyor : 9190 / node_modules / rxjs / Observable / EmptyObservable.js Hata: XHR hatası (404 Bulunamadı) localhost
user630209

29

Evet, boş operatörüm var

Rx.Observable.empty();

Patlama için şunları kullanabilirsiniz from:

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

Ben alıyorum Rx.Observable<{}>etmek atanamama Observable<Response>, ben çalıştım Rx.Observable<Response>.empty()ama işi yoktu
Murhaf Sousli

Dönüş türünü değiştirdim Observable<any>ve işe yaradı, teşekkürler dostum.
Murhaf Sousli

2
Rx.Observable.from([])Olmadan olmalı <Response>. Aksi takdirde "ifade bekleniyor" hatası alıyorum.
Andriy Tolstoy

2
Ayrıca kullanabilirsiniz Rx.Observable.of([]).
Andriy Tolstoy

1
@AndriyTolstoy Bunun eşdeğer olduğundan emin değilim. İçinde Observable.of([]), yayılan bir değer vardır ( []) ve ardından akış tamamlanır. İle Observable.from([])hiçbir değer duyulur, dere hemen tamamlar.
Pac0

24

Boş bir Gözlemlenebilir oluşturmanın birkaç yolu:

: Onlar sadece (o sonra yayacaktır hangi olayların daha da kullanacağız nasıl farklılık next, completeya do nothingmesela):

  • Observable.never() - hiçbir olay yayınlamaz ve asla bitmez.
  • Observable.empty()- sadece yayar complete.
  • Observable.of({})- her ikisini de yayar nextve complete(Örnek olarak boş nesne değişmez değeri geçti).

Tam ihtiyaçlarınız için kullanın)


13

Örneğin, Observable.of (empty_variable) öğesini döndürebilirsiniz

Observable.of('');

// or
Observable.of({});

// etc


1

RxJS 6

aşağıdaki gibi fonksiyondan da kullanabilirsiniz:

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

içe aktarmadan sonra:

import {from} from 'rxjs';

2
Bu, bir öğe (boş bir dize) sağlayacak bir Gözlemlenebilir oluşturur, bu nedenle bu belirli soruya uygun bir cevap gibi görünmez.
BrunoJCM

1

Buraya benzer bir soru ile geldi, yukarıdakiler benim için çalışmadı: "rxjs": "^6.0.0"Yapmam gereken hiçbir veri yayan bir gözlemlenebilir üretmek için:

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

0

Bunu dene

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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.