আমি এটা আমার মনে হয় যে আপনার ব্যবহার করা হয় flatMap
যখন ফাংশন তোমাদের ভিতরে রাখা চেয়েছিলেন map()
আয় একটি Observable
। কোন ক্ষেত্রে আপনি এখনও ব্যবহারের চেষ্টা করতে পারেন map()
তবে এটি অনুশীলনীয় হবে। আমাকে কেন ব্যাখ্যা করার চেষ্টা করুন।
যদি এই ক্ষেত্রে আপনি স্থির থাকার সিদ্ধান্ত নিয়েছেন map
তবে আপনি একটি পেয়ে যাবেন Observable<Observable<Something>>
। উদাহরণস্বরূপ আপনার ক্ষেত্রে, আমরা যদি কোনও কাল্পনিক আরএক্সজিউন লাইব্রেরি ব্যবহার করি, যা Observable<String>
এর toJson()
পদ্ধতি থেকে একটি ফিরিয়ে দিয়েছে (কেবলমাত্র ফিরে আসার পরিবর্তে String
) এটি দেখতে এরকম হবে:
Observable.from(jsonFile).map(new Func1<File, Observable<String>>() {
@Override public Observable<String>> call(File file) {
return new RxGson().toJson(new FileReader(file), Object.class);
}
}); // you get Observable<Observable<String>> here
এই মুহুর্তে এটি subscribe()
একটি পর্যবেক্ষণযোগ্যদের কাছে বেশ জটিল হবে । এর অভ্যন্তরে আপনি এমন একটি Observable<String>
পাবেন যা আপনাকে আবার subscribe()
মান পেতে হবে। যা দেখতে ব্যবহারিক বা সুন্দর নয়।
সুতরাং এটিকে কার্যকর করার জন্য একটি ধারণা হ'ল এই পর্যবেক্ষণযোগ্যদের "সমতল" করা (আপনি _flat_Map নামটি কোথা থেকে এসেছে তা দেখতে শুরু করতে পারেন)। RxJava observables চেপ্টা জন্য কয়েকটি উপায় উপলব্ধ করা হয় এবং সরলতা অনুরোধে জন্য দেয় অনুমান একত্রীকরণ হয় আমরা কি চাই। মার্জটি মূলত পর্যবেক্ষণের একগুচ্ছ লাগে এবং যখনই তাদের মধ্যে যে কোনওরই বের হয় em (প্রচুর লোকের যুক্তি ছিল যে স্যুইচটি আরও ভাল ডিফল্ট হতে পারে But তবে আপনি যদি কেবল একটি মান নির্ধারণ করেন তবে তা কোনও ব্যাপার নয়))
সুতরাং আমাদের আগের স্নিপেটটি সংশোধন করে আমরা পেয়ে যাব:
Observable.from(jsonFile).map(new Func1<File, Observable<String>>() {
@Override public Observable<String>> call(File file) {
return new RxGson().toJson(new FileReader(file), Object.class);
}
}).merge(); // you get Observable<String> here
এটি অনেক বেশি দরকারী, কারণ এটির (বা ম্যাপিং, বা ফিল্টারিং, বা ...) সাবস্ক্রাইব করে আপনি কেবল String
মূল্য পান get (এছাড়াও, মনে রাখবেন, merge()
আরএক্সজেবাতে এ জাতীয় রূপের অস্তিত্ব নেই, তবে আপনি যদি মার্জ করার ধারণাটি বুঝতে পারেন তবে আমি আশা করি কীভাবে এটি কার্যকর হবে তাও আপনি বুঝতে পেরেছেন))
সুতরাং মূলত কারণ এগুলি merge()
সম্ভবত কেবল তখনই কার্যকর হওয়া উচিত যখন এটি map()
কোনও পর্যবেক্ষণযোগ্য প্রত্যাবর্তন সফল হয় এবং তাই আপনাকে বার বার এটি টাইপ করতে হবে না, flatMap()
একটি শর্টহ্যান্ড হিসাবে তৈরি হয়েছিল। এটি ম্যাপিং ফাংশনটি ঠিক একটি সাধারণের মতো প্রয়োগ করে map()
তবে পরে প্রত্যাবর্তিত মানগুলি পরিবর্তনের পরিবর্তে এটি তাদের "সমতল" (বা মার্জ) করে।
এটি সাধারণ ব্যবহারের ক্ষেত্রে। এটি কোনও কোডবেজে সবচেয়ে কার্যকর যা এই স্থানটি আরক্সকে ব্যবহার করে এবং আপনার কাছে পর্যবেক্ষণে ফিরে আসার অনেক পদ্ধতি রয়েছে, যা আপনি পর্যবেক্ষনে ফিরে আসা অন্যান্য পদ্ধতির সাথে শৃঙ্খলাবদ্ধ করতে চান।
আপনার ব্যবহারের ক্ষেত্রে এটি কার্যকর হিসাবেও ঘটবে, কারণ map()
কেবল নির্গত এক মানকে নির্গত onNext()
অন্য মানকে রূপান্তর করতে পারে onNext()
। তবে এটি এটিকে একাধিক মানগুলিতে রূপান্তর করতে পারে না, মূল্য বা ত্রুটির কোনও মূল্য নেই। এবং আকর্ণোকদ তাঁর উত্তরে যেমন লিখেছিলেন (এবং মনে রাখবেন তিনি আমার চেয়ে অনেক বেশি স্মার্ট, সম্ভবত সাধারণভাবে, তবে অন্তত যখন আরএক্সজাবার কথা আসে) আপনার নিজের থেকে ব্যতিক্রম ছোঁড়া উচিত নয় map()
। সুতরাং পরিবর্তে আপনি flatMap()
এবং ব্যবহার করতে পারেন
return Observable.just(value);
যখন সব ঠিকঠাক হয়, কিন্তু
return Observable.error(exception);
যখন কিছু ব্যর্থ হয়।
সম্পূর্ণ স্নিপেটের জন্য তার উত্তরটি দেখুন: https://stackoverflow.com/a/30330772/1402641
subscriber.onError()
ইত্যাদি কল করে না আমি যে সমস্ত উদাহরণ দেখেছি তার মধ্যে ত্রুটিগুলি রুট হয়েছে। তাতে কি কিছু আসে যায় না?