শুধু আশ্চর্য হ'ল Observable.combineLatest
এবং এর মধ্যে পার্থক্য কী Observable.forkJoin
? যতদূর আমি দেখতে পাচ্ছি, কেবলমাত্র পার্থক্য হ'ল forkJoin
পর্যবেক্ষণগুলি সম্পন্ন হবে combineLatest
এবং সর্বশেষতম মানগুলি প্রত্যাবর্তন করবে।
উত্তর:
forkJoin
সমস্ত ইনপুট পর্যবেক্ষণগুলি সম্পূর্ণ করার জন্য কেবল এটির প্রয়োজন নেই , তবে এটি এমন একটি পর্যবেক্ষণযোগ্যও ফেরত দেয় যা একটি একক মান তৈরি করে যা ইনপুট পর্যবেক্ষণের দ্বারা উত্পাদিত শেষ মানগুলির একটি অ্যারে। অন্য কথায়, এটি শেষ ইনপুট পর্যবেক্ষণযোগ্য সম্পূর্ণ হওয়া পর্যন্ত অপেক্ষা করে এবং তারপরে একটি একক মান উত্পাদন করে এবং সম্পূর্ণ হয়।
বিপরীতে, combineLatest
একটি পর্যবেক্ষণযোগ্য ফেরত দেয় যা প্রতিবার ইনপুট পর্যবেক্ষণযোগ্যরা একবার নতুন মান তৈরি করে, সমস্ত ইনপুট পর্যবেক্ষকরা কমপক্ষে একটি মান তৈরি করে। এর অর্থ এটি অসীম মান থাকতে পারে এবং এটি সম্পূর্ণ নাও হতে পারে। এর অর্থ হ'ল ইনপুট পর্যবেক্ষণযোগ্যদের কোনও মান উত্পাদন করার আগে শেষ করতে হবে না।
.catch()
, .onErrorResumeNext()
এবং সম্ভবত .retry()
(যদি এইচটিটিপি কলটি মাঝে মাঝে ব্যর্থ হতে পারে))
combineLatest()
, আপনি কীভাবে ইনপুট পর্যবেক্ষণগুলি থেকে সর্বশেষ মানগুলি থেকে আউটপুট মান উত্পাদন করতে হবে তা নির্দিষ্ট করতে একটি প্রজেকশন ফাংশন সরবরাহ করতে পারেন। ডিফল্টরূপে, আপনি যদি একটি নির্দিষ্ট না করেন তবে আপনি সর্বশেষতম মানগুলির একটি অ্যারে পাবেন।
এছাড়াও:
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))
আপনি ইনপুট অ্যারেতে যোগ করার সাথে সাথে পর্যবেক্ষণযোগ্য উত্সে যোগ করতে পারেন ।
concat()
মধ্যে combineLatest()
কোড করছে। এটি আমার কাছে Array.prototype.concat
পদ্ধতির মতো দেখায় , আরএক্সজেএস concat
পদ্ধতি নয়। ধরে নিচ্ছি আমি সঠিক, তবে এই উত্তরটি বিভ্রান্তিমূলক এবং ভুল, যেমন combineLatest()
পর্যায়ক্রমে পর্যবেক্ষণযোগ্যরা একের পর এক কার্যকর করে না। এটা তাদের সমান্তরাল executes, যেমন একই forkJoin()
। পার্থক্য হ'ল কতটি মান উত্পন্ন হয় এবং যদি উত্স পর্যবেক্ষণযোগ্যকে সম্পন্ন করতে হয় বা না হয়।
[source].concat(observables)
যে " combineLatest
অভ্যন্তরীণভাবে ব্যবহার করে concat
" বলার সময় আপনি এই অর্থটি বোঝাচ্ছেন । আমার কাছে মনে হচ্ছে আপনি আরএক্সজেএস কনক্টের সাথে অ্যারে কনক্যাটকে বিভ্রান্ত করছেন। পরেরটি প্রকৃতপক্ষে ক্রমানুসারে ইনপুট পর্যবেক্ষণগুলি সম্পাদন করে, প্রতিটি সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করে। তবে এটি ব্যবহার করে না combineLatest()
, এটি সম্পূর্ণ আলাদা একটি অপারেটর।
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));
ফর্কজয়াইন - যখন সমস্ত পর্যবেক্ষণযোগ্যগুলি সম্পূর্ণ হয়, তখন প্রতিটিের থেকে শেষ নির্গত মান নির্গত হয়।
কম্বাইনএলটেস্ট - যখন কোনও পর্যবেক্ষণযোগ্য কোনও মান নির্গত করে, তখন প্রতিটিের কাছ থেকে সর্বশেষ মানটি নির্গত হয়।
ব্যবহার বেশ অনুরূপ, তবে আপনি কাঁটাচামচ এর বিপরীতে কম্বাইনেস্ট থেকে সাবস্ক্রাইব করতে ভুলবেন না ।
combineLatest()
এবংforkJoin()
কার্যকারিতা যা একটি পর্যবেক্ষণযোগ্য তৈরি করে। তারা একই কাজ করে তবে সিনট্যাক্সটি আলাদা। বিভ্রান্ত করবেন না যাcombineLatest
থেকেrxjs/operators
একটি 'পাইপযোগ্য' অপারেটর। আপনি যদি ভুলটি আমদানি করেন তবে ত্রুটি পাবেন।