একটি খালি পর্যবেক্ষণযোগ্য ফেরত দিন


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

হালনাগাদ

আরএক্সজেএস 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

আরএক্সজেএস 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
সিম্পলজি

@ সিম্পলজি হ্যাঁ আপনি সঠিক, take(1)একটি ভাল উত্তরের জন্য মুছে ফেলা ব্যবহার করার জন্য আমার খারাপ । @ ম্যাথিজ ওয়েজসেলস, হ্যাঁ এবং না, এখনই এটি পরীক্ষা করা হয়েছে এবং যদি আপনি of()নির্গমন ছাড়াই একটি সম্পূর্ণ পর্যবেক্ষণযোগ্য ফেরত next
পাঠান

খালি এখন হ্রাস করা হয়েছে, পরিবর্তে EMPTY ব্যবহার করুন (পদ্ধতি হিসাবে পরিবর্তে ধ্রুবক হিসাবে ব্যবহৃত হয়, সাইমন_উইভারের উত্তর দেখুন)।
EriF89

দয়া করে মনে রাখবেন, এর () কোনও মান নির্গত করে না। আপনি যদি একটি চান তবে আপনার কোনও মান সরবরাহ করা উচিত, এমনকি অপরিজ্ঞাত বা নালও ঠিক আছে: এর (নাল) মানটি নির্ধারণ করে (এবং ট্যাপ / সাবস্ক্রাইব পদ্ধতিতে প্রক্রিয়াগুলি), যখন () দেয় না।
ম্যাক্সিমাম জর্জিভস্কিই

51

আরএক্সজেএস 6 (সামঞ্জস্যতা প্যাকেজ ইনস্টল ছাড়াই)

এখন একটি EMPTYধ্রুবক এবং একটি emptyফাংশন আছে।

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

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

Observable.empty() আর অস্তিত্ব নেই।



আপনি এই ধরনের একটি যেমন একটি দ্বন্দ্ব থাকে, তাহলে empty()ফাংশন ইতিমধ্যে আপনি বলতে পারেন import { empty as rxEmpty }বা import { empty as _empty }এবং তারপর কি rxEmpty()বা _empty()। অবশ্যই এটি করা খুব সুন্দর একটি মানসম্পন্ন জিনিস এবং আমি আসলে এটির সুপারিশ করছি না, তবে আমি নিশ্চিত যে আমিই একমাত্র আশ্চর্য হয়েছি না যে আরএক্সজেএস মনে করে যে এটি আমার নামস্থান 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';
কিল্ডারেফ্লেরে 6'17

এই জাতীয় ত্রুটি পেয়ে, আমার কি সিস্টেম-কনফিগারেশনে কোনও কনফিগার করার দরকার আছে? আনহ্যান্ডলড প্রতিশ্রুতি প্রত্যাখ্যান: (সিস্টেমজেএস) এক্সএইচআর ত্রুটি (404 পাওয়া যায় নি) লোকালহোস্ট লোড হচ্ছে : 9190 / নোড_মডিউলগুলি / আরএক্সজেএস / পর্যবেক্ষণযোগ্য / খালি অবজার্ভ.জেএস ত্রুটি: এক্সএইচআর ত্রুটি (404 পাওয়া যায়নি) লোডিংহোস্ট
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
@ অ্যান্ড্রি টলস্টয় আমাকে নিশ্চিত নয় যে এটি সমতুল্য। ইন 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

2

অথবা আপনি চেষ্টা করে দেখতে পারেন ignoreElements()পাশাপাশি


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();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.