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.