एक रिक्त प्रेक्षण योग्य लौटें


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

टाइपस्क्रिप्ट के लिए आप इस तरह से अपने खाली अवलोकन के सामान्य पैराम को निर्दिष्ट कर सकते हैं:

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
SimpleGy

@SimplGy हाँ आप सही हैं, take(1)बेहतर उत्तर के लिए हटाए गए उपयोग के लिए मेरा बुरा । @MatthijsWessels, हाँ और नहीं, बस अब यह परीक्षण किया है और यदि आप करते हैं तो of()बिना उत्सर्जन के एक पूरी तरह से देख next
लेंगे

खाली अब पदावनत कर दिया गया है, इसके बजाय EMPTY का उपयोग करें (एक विधि के बजाय एक स्थिरांक के रूप में उपयोग किया जाता है, Simon_Weaver द्वारा उत्तर देखें)।
एरीएफ89

कृपया ध्यान में रखें () किसी भी मूल्य का उत्सर्जन नहीं करता है। यदि आप एक चाहते हैं, तो आपको कोई भी मूल्य प्रदान करना चाहिए, यहां तक ​​कि अपरिभाषित या अशक्त भी ठीक है, इसके लिए: (नल) मान (और प्रक्रियाओं को टैप / सदस्यता विधियों के साथ) का उत्सर्जन करता है, जबकि () नहीं करता है।
मैक्सिम जार्जियावस्की

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मेरी नेम स्पेस में!
सिमोन_वेर

1
कोणीय का उपयोग करते समय सावधानी बरतें क्योंकि ऐसा भी है import { EMPTY } from "@angular/core/src/render3/definition";जो पूरी तरह से वह नहीं है जो आप चाहते हैं। इसलिए यदि आपको विषम त्रुटियां हो रही हैं, तो सुनिश्चित करें कि आप गलती से आयात नहीं कर रहे हैं।
सिमोन_विवर

Observable.empty()वास्तव में अभी भी मौजूद है, लेकिन इसके पक्ष में पदावनत किया गया है EMPTY
अलेक्जेंडर अबाकुमोव

39

Angular2 और rxjs के साथ मेरे मामले में, इसने साथ काम किया:

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

7
इसे साथ में शामिल करेंimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare

इस तरह त्रुटि हो रही है, क्या मुझे सिस्टम-कॉन्फ़िगरेशन में कुछ भी कॉन्फ़िगर करने की आवश्यकता है? अनहेल्ड प्रॉमिस रिजेक्शन: (SystemJS) XHR एरर (404 Not Found) लोडिंग लोकलहोस्ट: 9190 / node_modules / rxjs / ऑब्जर्वेबल / एमप्टी ओब्जर्वेबल।जेएस एरर: एक्सहोर एरर (404 नॉट फाउंड) लोडिंग लोकलहोस्ट: 9190 / node_modules / rxjs / ऑब्जर्वेबल इमिग्रेशन। js
user630209

29

हां, एमिप्ट ऑपरेटर है

Rx.Observable.empty();

टाइपस्क्रिप्ट के लिए, आप उपयोग कर सकते हैं from:

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

मुझे मिल Rx.Observable<{}>नहीं रहा है Observable<Response>, मैं कोशिश कर रहा हूँ , Rx.Observable<Response>.empty()लेकिन यह काम नहीं किया
Murhaf Sousli

मैंने वापसी प्रकार को बदल दिया Observable<any>और यह काम किया, धन्यवाद दोस्त।
मुराफ सूसली

2
इसके Rx.Observable.from([])बिना होना चाहिए <Response>। अन्यथा एक त्रुटि "अभिव्यक्ति की उम्मीद" हो रही है।
एंड्री टॉल्स्टॉय

2
आप भी इस्तेमाल कर सकते हैं Rx.Observable.of([])
एंड्री टॉल्स्टॉय

1
@AndriyTolstoy मुझे यकीन नहीं है कि यह बराबर है। इसमें Observable.of([]), एक मान उत्सर्जित होता है ( []) और फिर धारा पूरी हो जाती है। के साथ Observable.from([]), कोई मूल्य उत्सर्जित नहीं होता है, धारा तुरंत पूरी होती है।
पच0

24

खाली प्रेक्षण योग्य बनाने के कई तरीके:

: वे सिर्फ आप इसे कैसे आगे उपयोग करने के लिए (क्या घटनाओं के बाद उत्सर्जित करेगा जा रहे हैं पर कुछ अलग next, completeया do nothingजैसे):

  • Observable.never() - कोई घटना नहीं है और कभी नहीं समाप्त होता है।
  • Observable.empty()- केवल उत्सर्जन करता है complete
  • Observable.of({})- दोनों का उत्सर्जन करता है nextऔर complete(एक उदाहरण के रूप में खाली वस्तु शाब्दिक पारित)।

अपनी सटीक जरूरतों पर इसका इस्तेमाल करें)


13

आप उदाहरण के लिए, Observable.of (रिक्त_वर्णीय) वापस कर सकते हैं

Observable.of('');

// or
Observable.of({});

// etc


1

आरएक्सजेएस 6

आप नीचे दिए गए फ़ंक्शन से भी उपयोग कर सकते हैं:

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

आयात के बाद:

import {from} from 'rxjs';

2
यह एक ऑब्जर्वेबल का निर्माण करेगा जो एक तत्व (एक खाली स्ट्रिंग) प्रदान करेगा, इसलिए यह इस विशिष्ट प्रश्न के उचित उत्तर की तरह नहीं दिखता है।
ब्रूनो जेसीएम

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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.