আরএক্সজেস: অবজারেবল.টাইনবাইনস্টেস্ট বনাম অবজারভেবল.ফোর্কজয়াইন


86

শুধু আশ্চর্য হ'ল Observable.combineLatestএবং এর মধ্যে পার্থক্য কী Observable.forkJoin? যতদূর আমি দেখতে পাচ্ছি, কেবলমাত্র পার্থক্য হ'ল forkJoinপর্যবেক্ষণগুলি সম্পন্ন হবে combineLatestএবং সর্বশেষতম মানগুলি প্রত্যাবর্তন করবে।


4
দ্রষ্টব্য: rxjs6 + এ এগুলি এখন কেবলমাত্র combineLatest()এবং forkJoin()কার্যকারিতা যা একটি পর্যবেক্ষণযোগ্য তৈরি করে। তারা একই কাজ করে তবে সিনট্যাক্সটি আলাদা। বিভ্রান্ত করবেন না যা combineLatestথেকে rxjs/operatorsএকটি 'পাইপযোগ্য' অপারেটর। আপনি যদি ভুলটি আমদানি করেন তবে ত্রুটি পাবেন।
সাইমন_উইভার

উত্তর:


129

forkJoinসমস্ত ইনপুট পর্যবেক্ষণগুলি সম্পূর্ণ করার জন্য কেবল এটির প্রয়োজন নেই , তবে এটি এমন একটি পর্যবেক্ষণযোগ্যও ফেরত দেয় যা একটি একক মান তৈরি করে যা ইনপুট পর্যবেক্ষণের দ্বারা উত্পাদিত শেষ মানগুলির একটি অ্যারে। অন্য কথায়, এটি শেষ ইনপুট পর্যবেক্ষণযোগ্য সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করে এবং তারপরে একটি একক মান উত্পাদন করে এবং সম্পূর্ণ হয়।

বিপরীতে, combineLatestএকটি পর্যবেক্ষণযোগ্য ফেরত দেয় যা প্রতিবার ইনপুট পর্যবেক্ষণযোগ্যরা একবার নতুন মান তৈরি করে, সমস্ত ইনপুট পর্যবেক্ষকরা কমপক্ষে একটি মান তৈরি করে। এর অর্থ এটি অসীম মান থাকতে পারে এবং এটি সম্পূর্ণ নাও হতে পারে। এর অর্থ হ'ল ইনপুট পর্যবেক্ষণযোগ্যদের কোনও মান উত্পাদন করার আগে শেষ করতে হবে না।


@ গ্রেগল এমন একটি ফাংশন আছে যা ফর্কজয়িনের মতো কাজ করে তবে ব্যর্থ HTTP কলগুলির সাথেও কাজ করবে?
টুক্কন

4
@ টুক্কান, আমি এমন একটি অপারেটরকে শৃঙ্খলাবদ্ধ করব যা প্রতিটি ত্রুটি থেকে পর্যবেক্ষণযোগ্য ত্রুটি থেকে পুনরুদ্ধার করে, যাতে আপনি প্রতিটি অনুরোধের জন্য ত্রুটি হিসাবে ব্যবহারের জন্য মূল্য (গুলি) সংজ্ঞায়িত করেন, বরং অপারেটরের সন্ধানের চেয়ে এমন একাধিক পর্যবেক্ষণের সম্মিলন করে যা ত্রুটি হতে পারে (I আমি নিশ্চিত না যে এই ধরনের অপারেটর রয়েছে। ত্রুটি থেকে পুনরুদ্ধারকারী অপারেটরগুলির মধ্যে রয়েছে .catch(), .onErrorResumeNext()এবং সম্ভবত .retry()(যদি এইচটিটিপি কলটি মাঝে মাঝে ব্যর্থ হতে পারে))
গ্রেগএল

4
কেবল স্পষ্ট করার জন্য, তারা উভয় অ্যারে উত্পাদন করে।
সাইমন_উইভার

@ সিমন_ ওয়েভার অগত্যা নয়। এর ক্ষেত্রে combineLatest(), আপনি কীভাবে ইনপুট পর্যবেক্ষণগুলি থেকে সর্বশেষ মানগুলি থেকে আউটপুট মান উত্পাদন করতে হবে তা নির্দিষ্ট করতে একটি প্রজেকশন ফাংশন সরবরাহ করতে পারেন। ডিফল্টরূপে, আপনি যদি একটি নির্দিষ্ট না করেন তবে আপনি সর্বশেষতম মানগুলির একটি অ্যারে পাবেন।
গ্রেগএল

কম্বিনেস্টেস্ট থেকে প্রতিটি নির্গমন সংগ্রহ করা মানগুলির একটি অ্যারে। আমি কেবল এটি যুক্ত করতে চেয়েছিলাম যেহেতু আপনি কেবল ফর্কজইনের জন্য অ্যারের উল্লেখ করেছেন। সুতরাং যেভাবে তারা একই। এবং হ্যাঁ সবসময় আরএক্সজেএস-এর সাথে সূক্ষ্মতা রয়েছে তাই যদি আমি কিছু মিস করি তবে আপনি কী বলতে চেয়েছিলেন তা আপনি পরিষ্কার করতে পারেন।
সাইমন_উইভার

14

এছাড়াও:

কম্বিনেস্টেস্ট (...) একের পর এক ক্রমানুসারে পর্যবেক্ষণযোগ্য চালায়

combineLatestঅভ্যন্তরীণভাবে ব্যবহার করে concat, যার অর্থ পরের দিকে যাওয়ার আগে অ্যারেতে প্রতিটি পর্যবেক্ষণযোগ্যের জন্য একটি মান অবশ্যই পাওয়া উচিত।

// partial source of static combineLatest (uses the rxjs/operators combineLatest internally):
// If you're using typescript then the output array will be strongly typed based on type inference
return function (source) { return source.lift.call(from_1.from([source].concat(observables)), 
                           new combineLatest_1.CombineLatestOperator(project)); };

কাঁটাচামচ (...) একই সময়ে সমান্তরালে পর্যবেক্ষণযোগ্য চালায়

যদি আপনার কাছে 3 উত্স পর্যবেক্ষণযোগ্য থাকে এবং এগুলির প্রত্যেকে চালাতে 5 সেকেন্ড সময় নেয় তবে এটি চালাতে 15 সেকেন্ড সময় লাগবে combineLatest। যদিও forkJoinতারা সমান্তরালভাবে সম্পাদন করে তাই এটিতে 5 সেকেন্ড সময় লাগবে।

যাতে অর্ডার প্রয়োগ করা হয় না এমনভাবে forkJoinআরও কিছু কাজ Promise.all(...)করে।

ত্রুটি পরিচালনার জন্য বিবেচনা:

যদি পর্যবেক্ষণযোগ্যদের মধ্যে কোনও ত্রুটি থেকে বেরিয়ে যায় - তবে পরবর্তীগুলির সাথে combineLatestমৃত্যুদন্ড কার্যকর করা হবে না, তবে forkJoinসেগুলি সব চলমান রয়েছে। সুতরাং combineLatestপর্যবেক্ষণযোগ্যদের একটি 'ক্রম' কার্যকর করতে এবং ফল একসাথে সংগ্রহ করতে কার্যকর হতে পারে।


উন্নত দ্রষ্টব্য: উত্স পর্যবেক্ষণগুলি যদি ইতিমধ্যে 'চলমান' (অন্য কোনও কিছুর সাথে সাবস্ক্রাইব) হয়ে থাকে এবং আপনি shareসেগুলি ব্যবহার করেন - তবে আপনি এই আচরণটি দেখতে পাবেন না।

আরও উন্নত দ্রষ্টব্য: কম্বাইনএলটেস্ট সর্বদা আপনাকে প্রতিটি উত্স থেকে সর্বশেষ দেবে, সুতরাং যদি উত্স পর্যবেক্ষণযোগ্য কেউ একাধিক মান নির্ধারণ করে তবে আপনি সর্বশেষতমটি পাবেন। এটি প্রতিটি উত্সের জন্য কেবল একটি একক মান পায় না এবং পরবর্তীটিতে চলে যায়। আপনার যদি নিশ্চিত হওয়া দরকার যে আপনি প্রতিটি উত্সের জন্য কেবলমাত্র 'পরবর্তী উপলভ্য আইটেম' পেয়েছেন তবে .pipe(take(1))আপনি ইনপুট অ্যারেতে যোগ করার সাথে সাথে পর্যবেক্ষণযোগ্য উত্সে যোগ করতে পারেন ।


বিবেচনা ত্রুটি পরিচালনা করার জন্য ধন্যবাদ। একাধিক পর্যবেক্ষণের ক্ষেত্রে ত্রুটি পরিচালনার বিষয়টি বোঝা বেশ শক্ত।
ডি দেশমনে

4
আমি বিশ্বাস করি আপনি ভুল ব্যাখ্যা কি concat()মধ্যে combineLatest()কোড করছে। এটি আমার কাছে Array.prototype.concatপদ্ধতির মতো দেখায় , আরএক্সজেএস concatপদ্ধতি নয়। ধরে নিচ্ছি আমি সঠিক, তবে এই উত্তরটি বিভ্রান্তিমূলক এবং ভুল, যেমন combineLatest()পর্যায়ক্রমে পর্যবেক্ষণযোগ্যরা একের পর এক কার্যকর করে না। এটা তাদের সমান্তরাল executes, যেমন একই forkJoin()। পার্থক্য হ'ল কতটি মান উত্পন্ন হয় এবং যদি উত্স পর্যবেক্ষণযোগ্যকে সম্পন্ন করতে হয় বা না হয়।
গ্রেগএল

@ গ্রেগল অ্যারে কোডক্যাট পর্যবেক্ষণযোগ্যদের সাথে অর্থহীন। আমি একেবারে কনক্টের ক্রমিক প্রকৃতির উপর নির্ভর করি - বোঝার মূল বিষয়টি হ'ল তারা সমস্ত কার্যকর না হওয়া পর্যন্ত আপনি কোনও আউটপুট মান পান না।
সাইমন_উইভার

আপনি পোস্ট করা নমুনা উত্স কোডটিতে আমি এই কোডটির উল্লেখ করছি: ধরে নিচ্ছি [source].concat(observables)যে " combineLatestঅভ্যন্তরীণভাবে ব্যবহার করে concat" বলার সময় আপনি এই অর্থটি বোঝাচ্ছেন । আমার কাছে মনে হচ্ছে আপনি আরএক্সজেএস কনক্টের সাথে অ্যারে কনক্যাটকে বিভ্রান্ত করছেন। পরেরটি প্রকৃতপক্ষে ক্রমানুসারে ইনপুট পর্যবেক্ষণগুলি সম্পাদন করে, প্রতিটি সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করে। তবে এটি ব্যবহার করে না combineLatest(), এটি সম্পূর্ণ আলাদা একটি অপারেটর।
গ্রেগএল

4
আমি বিশ্বাস করি combineLatest()এবং forkJoin()উভয়ই সমান্তরালভাবে চলে। নীচের কোডটি চালানো উভয়ের জন্য প্রায় 5000 করে আউটপুট দেয়। const start = new Date().getTime(); combineLatest([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start)); forkJoin([of(null).pipe(delay(5000)), of(null).pipe(delay(5000)), of(null).pipe(delay(5000))]).subscribe(() => console.log(new Date().getTime() - start));
জেরেমি

13

ফর্কজয়াইন - যখন সমস্ত পর্যবেক্ষণযোগ্যগুলি সম্পূর্ণ হয়, তখন প্রতিটিের থেকে শেষ নির্গত মান নির্গত হয়।

কম্বাইনএলটেস্ট - যখন কোনও পর্যবেক্ষণযোগ্য কোনও মান নির্গত করে, তখন প্রতিটিের কাছ থেকে সর্বশেষ মানটি নির্গত হয়।

ব্যবহার বেশ অনুরূপ, তবে আপনি কাঁটাচামচ এর বিপরীতে কম্বাইনেস্ট থেকে সাবস্ক্রাইব করতে ভুলবেন না ।


4
যদি কোনও অনুরোধ ব্যর্থ হয় তবে সমস্ত নেস্টেড প্রয়োজনীয়তা স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়, আমি কীভাবে এটি সমাধান করব?
সুনীল গার্গ

4
@ সুনিলগার্গ আপনি সমস্ত ফলাফল পেতে চাইলে আপনার কাঁটাচামচ বা কম্বিনেটেস্ট ব্যবহার করা উচিত। আপনি যদি সমস্ত ফলাফলের যত্ন না নেন তবে আপনার সাবস্ক্রিপশন আলাদাভাবে ব্যবহার করা উচিত।
দিমিত্রি গ্রিঙ্কো


কোড উদাহরণ সহ সাবস্ক্রাইব কেন প্রয়োজনীয় তা আপনি ব্যাখ্যা করতে পারেন
সুনীল গার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.