কীভাবে আমি বিলম্ব সহ একটি পর্যবেক্ষণযোগ্য তৈরি করতে পারি


92

প্রশ্ন

পরীক্ষার উদ্দেশ্যে, আমি Observableএমন অবজেক্ট তৈরি করছি যা পর্যবেক্ষণযোগ্য প্রতিস্থাপন করে যা একটি প্রকৃত HTTP কল দিয়ে ফিরে আসবে Http

আমার পর্যবেক্ষণযোগ্য নিম্নলিখিত কোডটি দিয়ে তৈরি হয়েছে:

fakeObservable = Observable.create(obs => {
  obs.next([1, 2, 3]);
  obs.complete();
});

কথাটি হচ্ছে, এই পর্যবেক্ষণযোগ্য তাত্ক্ষণিকভাবে নির্গত হয়। এর নির্গমনে কাস্টম বিলম্ব যুক্ত করার কোনও উপায় আছে কি?


ট্র্যাক

আমি এটি চেষ্টা করেছি:

fakeObservable = Observable.create(obs => {
  setTimeout(() => {
    obs.next([1, 2, 3]);
    obs.complete();
  }, 100);
});

তবে কাজ হচ্ছে বলে মনে হচ্ছে না।



আমি শৃঙ্খলাবদ্ধ .create(...)হওয়ার চেষ্টা করেছি .delay(1000)কিন্তু এটি কার্যকর হয়নি: পর্যবেক্ষণযোগ্য_1. অবজার্ভাল সিক্রিয়েট (...) দেরি কোনও ফাংশন নয়।
অ্যাড্রিয়েন ব্রুনিয়েল্ট

4
ঠিক কি আপনি সাধন করার চেষ্টা করছেন?
গন্টার জ্যাচবাউয়ার

আপনি কি পর্যবেক্ষণযোগ্য সাবস্ক্রাইব করছেন?
শুসন

আমার নিজের পর্যবেক্ষণযোগ্য সাথে এইচটিটিপি প্রতিক্রিয়া বিলম্ব জাল করুন। @ শুসন হ্যাঁ, আমি যে ক্লাসটি পরীক্ষা করছি সেটিকে সাবস্ক্রাইব করার জন্য পর্যবেক্ষণযোগ্যদের জন্য পরিষেবাটি (আমি উপহাস করার চেষ্টা করছি) কল করছি।
অ্যাড্রিয়েন ব্রুনিয়েল্ট

উত্তর:


144

নিম্নলিখিত আমদানি ব্যবহার:

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/delay';

এটা চেষ্টা কর:

let fakeResponse = [1,2,3];
let delayedObservable = Observable.of(fakeResponse).delay(5000);
delayedObservable.subscribe(data => console.log(data));

আপডেট: আরএক্সজেএস 6

উপরের সমাধান আরএক্সজেএস (এবং উদাহরণস্বরূপ কৌণিক) এর নতুন সংস্করণগুলিতে সত্যিই কাজ করে না।

সুতরাং দৃশ্যটি হ'ল আমার কাছে একটি এপিআই দিয়ে চেক করার জন্য আইটেমগুলির একটি অ্যারে রয়েছে। এপিআই কেবলমাত্র একটি আইটেম গ্রহণ করে এবং আমি সমস্ত অনুরোধ একবারে প্রেরণ করে API টি হত্যা করতে চাই না। সুতরাং মাঝখানে অল্প বিলম্বের সাথে আমার পর্যবেক্ষণযোগ্য স্ট্রিমে আইটেমগুলির একটি সময়সীম প্রকাশ হতে হবে।

নিম্নলিখিত আমদানি ব্যবহার করুন:

import { from, of } from 'rxjs';
import { delay } from 'rxjs/internal/operators';
import { concatMap } from 'rxjs/internal/operators';

তারপরে নিম্নলিখিত কোডটি ব্যবহার করুন:

const myArray = [1,2,3,4];

from(myArray).pipe(
        concatMap( item => of(item).pipe ( delay( 1000 ) ))
    ).subscribe ( timedItem => {
        console.log(timedItem)
    });

এটি মূলত আপনার অ্যারের প্রতিটি আইটেমের জন্য একটি নতুন 'বিলম্বিত' পর্যবেক্ষণযোগ্য তৈরি করে। এটি করার অন্যান্য অনেকগুলি উপায়ও রয়েছে তবে এটি আমার পক্ষে ভাল কাজ করেছে এবং 'নতুন' আরএক্সজেএস ফর্ম্যাটটি মেনে চলে।


4
প্রকারের 'সম্পত্তি' টাইপ 'পর্যবেক্ষণযোগ্য' টাইপটিতে বিদ্যমান নেই। আপনি কি সঙ্গে আপনার পর্যবেক্ষণযোগ্য আমদানি করবেন import {Observable} from 'rxjs/Observable';?
এড্রিয়েন ব্রুনিয়েল্ট

4
এই পৃষ্ঠা থেকে: npmjs.com/package/rxjs । আমি ছাড়িয়েছি আমাকে স্পষ্টভাবে আমদানি করতে হয়েছিল import 'rxjs/add/observable/of';। আপনি কি একই কাজ করতে চান? এটি এখনও অদ্ভুত, যেহেতু এটি .ডিলে (...) এর সাথে শৃঙ্খলিত হবে না এবং এটি চেষ্টা করার সময় এটি একটি ত্রুটি দেখায় rxjs/add/observable/delay...
অ্যাড্রিয়েন ব্রুনিয়েল্ট

4
অ্যারে পাইপ করার চেষ্টা করা উচিত of(item.pipe ( delay( 1000 ) ))যাতে of(item))).pipe(delay(1000)আমাকে ত্রুটি হয়
ডন থমাস বয়েল

4
এটিই আমার জন্য rxjs6 নিয়ে কাজ করেছিল: থেকে ([[1, 2, 3, 4, 5, 6, 7]) পাইপ (কনট্যাটম্যাপ (num => এর (সংখ্যা)। পাইপ (বিলম্ব (1000))))। সাবস্ক্রাইব (x => কনসোল.লগ (এক্স));
রবার্ট

4
@ মাইকওনের সমাধান আমার পক্ষেও কাজ করেছে। দুঃখের বিষয় যে এ জাতীয় সাধারণ বিষয়ের জন্য এত বেশি কোড প্রয়োজনীয় ...
কোডভি

103

আরএক্সজেএস 5+ এ আপনি এটি এর মতো করতে পারেন

import { Observable } from "rxjs/Observable";
import { of } from "rxjs/observable/of";
import { delay } from "rxjs/operators";

fakeObservable = of('dummy').pipe(delay(5000));

আরএক্সজেএস 6+ এ

import { of } from "rxjs";
import { delay } from "rxjs/operators";

fakeObservable = of('dummy').pipe(delay(5000));

আপনি যদি প্রতিটি নির্গত মানটি বিলম্ব করতে চান তবে

from([1, 2, 3]).pipe(concatMap(item => of(item).pipe(delay(1000))));

4
আমার মতে সবচেয়ে পরিষ্কার সমাধান।
মায়াও

আপনি যদি একটি আইটেম নির্গত করেন তবেই এই "সমাধান" কাজ করে। বিলম্ব অপারেটর একটি পর্যবেক্ষণযোগ্য প্রতিটি উপাদান জন্য অনুরোধ করা হয় না। এজন্য হররিড কনক্যাটম্যাপ সমাধানের প্রয়োজন।
রিক ও'শায়া

4
@ রিকো'সিয়া, প্রশ্নটি একটি নির্গত মান সম্পর্কে, সুতরাং এই কারণেই এই সমাধান।
অ্যাড্রিয়ান বের

4
তাই টাটকা এবং তাই পরিষ্কার!
নাহ্ন

আমি একাধিক বিলম্বের জন্য আমার উত্তর আপডেট করেছি @ রিকো'সিয়া
অ্যাড্রিয়ান বের

12

আপনি যা চান তা টাইমার:

// RxJS v6+
import { timer } from 'rxjs';

//emit [1, 2, 3] after 1 second.
const source = timer(1000).map(([1, 2, 3]);
//output: [1, 2, 3]
const subscribe = source.subscribe(val => console.log(val));

4
ভাল উত্তর, সাবস্ক্রাইব করতে ভুলবেন না
সামি

8

উত্তর দিতে দেরি হচ্ছে ... তবে সেক্ষেত্রে কেউ হয়ত এই প্রশ্নের উত্তর খুঁজছেন return

'বিলম্ব' হ'ল পর্যবেক্ষনের সম্পত্তি (ফাংশন)

fakeObservable = Observable.create(obs => {
  obs.next([1, 2, 3]);
  obs.complete();
}).delay(3000);

এটি আমার পক্ষে কাজ করেছে ...


4
import 'rxjs/add/operator/delay' এই ত্রুটিটি এখনই দেয়: মডিউলটি পাওয়া যায় নি: ত্রুটি: 'আরএক্সজেএস / অ্যাড / অপারেটর / বিলম্ব' সমাধান করতে পারে না
87

আপনি যখন একেবারে বাস্তব হিসাবে পর্যবেক্ষণযোগ্য জাল বলবেন কেন? :)
লেগোম্যান

0

import * as Rx from 'rxjs/Rx';

ব্লক কোডটি কাজ করতে আমাদের উপরের আমদানিটি যুক্ত করা উচিত

Let obs = Rx.Observable
    .interval(1000).take(3);

obs.subscribe(value => console.log('Subscriber: ' + value));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.