ส่งคืน Observable ที่ว่างเปล่า


167

ฟังก์ชั่นmore()ควรจะส่งกลับ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()เป็นจริงเท่านั้นฉันได้รับข้อผิดพลาดจาก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; 

คำตอบ:


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

มีเพียงสิ่งเดียวที่ต้องจำไว้ทำให้สิ่งที่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)ลบออกสำหรับคำตอบที่ดีกว่า @ MatijijWessels ใช่และไม่ใช่แค่ทดสอบตอนนี้และถ้าคุณof()จะกลับมาเป็นที่สังเกตได้อย่างสมบูรณ์โดยไม่ปล่อยnext
สตีเฟ่น Lautier

empty เลิกใช้แล้วให้ใช้ EMPTY แทน (ใช้เป็นค่าคงที่แทนที่จะเป็นวิธีดูที่คำตอบโดย Simon_Weaver)
EriF89

โปรดจำไว้ว่าจาก () ไม่ปล่อยค่าใด ๆ หากคุณต้องการคุณควรให้ค่าใด ๆ แม้จะไม่ได้กำหนดหรือ null ก็โอเคสำหรับ: of (null) ปล่อยค่า (และกระบวนการด้วยวิธีการแตะ / สมัครสมาชิก) ในขณะที่ () ไม่ได้
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() ไม่มีอีกแล้ว


คู่มืออัปเดต: github.com/ReactiveX/rxjs/blob/master/MIGRATION.md
Simon_Weaver

ถ้าคุณมีความขัดแย้งเช่นempty()ฟังก์ชั่นแล้วคุณสามารถพูดได้import { empty as rxEmpty }หรือimport { empty as _empty }แล้วทำหรือrxEmpty() _empty()แน่นอนว่าเป็นสิ่งที่ไม่สวยมาตรฐานที่จะทำและฉันไม่ได้จริง ๆ แนะนำ แต่ฉันแน่ใจว่าฉันไม่ได้เป็นเพียงคนเดียวที่รู้สึกประหลาดใจ RxJS คิดว่ามันมีคุณค่าของการนำเข้าเช่นฟังก์ชั่นofและemptyเข้าไปใน namespace ของฉัน!
Simon_Weaver

1
ระวังถ้าใช้แองกูลาร์เพราะยังมีimport { EMPTY } from "@angular/core/src/render3/definition";ที่ไม่สมบูรณ์สิ่งที่คุณต้องการ ดังนั้นหากคุณได้รับข้อผิดพลาดแปลก ๆ ตรวจสอบให้แน่ใจว่าคุณไม่ได้นำเข้านั้นโดยไม่ได้ตั้งใจ
Simon_Weaver

Observable.empty()จริงยังคงมีอยู่EMPTYแต่ก็เลิกในความโปรดปรานของ
อเล็กซานเด Abakumov

39

ในกรณีของฉันกับ Angular2 และ rxjs มันทำงานกับ:

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

7
รวมไว้ด้วยimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare

ได้รับข้อผิดพลาดเช่นนี้ฉันต้องกำหนดค่าอะไรใน system-config หรือไม่ การปฏิเสธสัญญาที่ไม่สามารถจัดการได้: (SystemJS) ข้อผิดพลาด XHR (ไม่พบ 404) กำลังโหลดlocalhost: 9190 / node_modules / rxjs / Observable / EmptyObservable.js ข้อผิดพลาด: ข้อผิดพลาด XHR (404 ไม่พบ) การโหลดlocalhost: 9190 / node_modules / Obxable js
user630209

29

ใช่มีตัวดำเนินการว่างอยู่

Rx.Observable.empty();

สำหรับ typescript คุณสามารถใช้from:

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

ฉันได้รับRx.Observable<{}>ไม่ได้มอบหมายให้กับObservable<Response>ผมพยายามที่จะRx.Observable<Response>.empty()แต่มันก็ไม่ได้ทำงาน
Murhaf Sousli

ฉันเปลี่ยนประเภทการส่งคืนเป็นObservable<any>และใช้งานได้ขอบคุณเพื่อน
Murhaf Sousli

2
มันควรจะเป็นโดยไม่ต้องRx.Observable.from([]) <Response>มิฉะนั้นจะได้รับข้อผิดพลาด "คาดหวังนิพจน์"
Andriy Tolstoy

2
Rx.Observable.of([])นอกจากนี้คุณยังสามารถใช้
Andriy Tolstoy

1
@AndriyTolstoy ฉันไม่แน่ใจว่านี่จะเทียบเท่า ในObservable.of([])มีค่าหนึ่งค่าที่ปล่อยออกมา ( []) และจากนั้นกระแสจะเสร็จสมบูรณ์ ด้วยObservable.from([])ไม่มีค่าจะถูกปล่อยออกกระแสจะเสร็จสมบูรณ์ทันที
Pac0

24

มีหลายวิธีในการสร้าง Empty Observable:

พวกเขาเพียงแค่แตกต่างกันในวิธีการที่คุณจะใช้มันต่อไป (เหตุการณ์อะไรมันจะปล่อยออกมาหลังจากที่: next, completeหรือdo nothing) เช่น:

  • Observable.never() - ไม่มีการปล่อยเหตุการณ์และไม่สิ้นสุด
  • Observable.empty()- completeส่งเสียงเท่านั้น
  • Observable.of({})- ส่งเสียงทั้งสองnextและcomplete(วัตถุที่ว่างเปล่าผ่านตัวอักษรเป็นตัวอย่าง)

ใช้กับความต้องการที่แน่นอนของคุณ)


13

คุณสามารถส่งคืน Observable.of (empty_variable) ตัวอย่างเช่น

Observable.of('');

// or
Observable.of({});

// etc


1

RxJS 6

คุณสามารถใช้งานได้จากฟังก์ชั่นด้านล่าง:

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

หลังจากนำเข้า:

import {from} from 'rxjs';

2
สิ่งนี้จะสร้าง Observable ที่จะให้องค์ประกอบหนึ่ง (สตริงว่าง) ดังนั้นมันจึงดูเหมือนคำตอบที่เหมาะสมสำหรับคำถามเฉพาะนี้
BrunoJCM

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.