আপনি কখন আরএক্সজেবাতে মানচিত্র বনাম ফ্ল্যাটম্যাপ ব্যবহার করবেন?


180

যখন আপনি ব্যবহার করবেন mapবনাম flatMapমধ্যে RxJava ?

বলুন, উদাহরণস্বরূপ, আমরা স্ট্রিংগুলিতে JSON- র সমন্বিত ফাইলগুলিতে মানচিত্র তৈরি করতে চাই -

ব্যবহার করে map, আমাদের সাথে ডিল করতে হবেException কোনওভাবে । কিন্তু কিভাবে?:

Observable.from(jsonFile).map(new Func1<File, String>() {
    @Override public String call(File file) {
        try {
            return new Gson().toJson(new FileReader(file), Object.class);
        } catch (FileNotFoundException e) {
            // So Exception. What to do ?
        }
        return null; // Not good :(
    }
});

ব্যবহার করে flatMap, এটি অনেক বেশি ভার্বোস, তবে আমরা সমস্যাটিকে শৃঙ্খলে রেখে এগিয়ে যেতে পারিObservables যেতে পারি এবং ত্রুটিটি পরিচালনা করতে পারি যদি আমরা অন্য কোথাও চয়ন করি এবং আবার চেষ্টা করি:

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(final File file) {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override public void call(Subscriber<? super String> subscriber) {
                try {
                    String json = new Gson().toJson(new FileReader(file), Object.class);

                    subscriber.onNext(json);
                    subscriber.onCompleted();
                } catch (FileNotFoundException e) {
                    subscriber.onError(e);
                }
            }
        });
    }
});

আমি এর সরলতা পছন্দ করি map, তবে ত্রুটি পরিচালনা flatmap(ভার্বোসটি নয়)। আমি এর চারপাশে ভাসমান কোনও সর্বোত্তম অনুশীলন দেখিনি এবং আমি কৌতূহল বোধ করি এটি কীভাবে অনুশীলনে ব্যবহৃত হচ্ছে।

উত্তর:


121

mapএকটি ইভেন্ট অন্য ঘটনা রূপান্তর। flatMapএকটি ইভেন্টকে শূন্য বা আরও ইভেন্টে রূপান্তর করুন। (এটি ইন্ট্রোটোআরএক্স থেকে নেওয়া হয়েছে )

আপনি যেমন আপনার জসনকে কোনও বস্তুতে রূপান্তর করতে চান, মানচিত্র ব্যবহার করা যথেষ্ট।

ফাইলনটফাউন্ডএক্সসেপশনকে মোকাবেলা করা আরেকটি সমস্যা (মানচিত্র বা ফ্ল্যাটম্যাপ ব্যবহার করা এই সমস্যার সমাধান করবে না)।

আপনার ব্যতিক্রম সমস্যা সমাধানের জন্য, কেবল একটি চেক না করা ব্যতিক্রমের সাহায্যে এটি ফেলে দিন: আরএক্স আপনার জন্য অনারার হ্যান্ডলারকে কল করবে।

Observable.from(jsonFile).map(new Func1<File, String>() {
    @Override public String call(File file) {
        try {
            return new Gson().toJson(new FileReader(file), Object.class);
        } catch (FileNotFoundException e) {
            // this exception is a part of rx-java
            throw OnErrorThrowable.addValueAsLastCause(e, file);
        }
    }
});

ফ্ল্যাটম্যাপের সাথে হুবহু একই সংস্করণ:

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(File file) {
        try {
            return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
        } catch (FileNotFoundException e) {
            // this static method is a part of rx-java. It will return an exception which is associated to the value.
            throw OnErrorThrowable.addValueAsLastCause(e, file);
            // alternatively, you can return Obersable.empty(); instead of throwing exception
        }
    }
});

আপনিও ফিরে আসতে পারেন, ফ্ল্যাটম্যাপ সংস্করণে একটি নতুন পর্যবেক্ষণযোগ্য যা কেবল একটি ত্রুটি।

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(File file) {
        try {
            return Observable.just(new Gson().toJson(new FileReader(file), Object.class));
        } catch (FileNotFoundException e) {
            return Observable.error(OnErrorThrowable.addValueAsLastCause(e, file));
        }
    }
});

2
এটি subscriber.onError()ইত্যাদি কল করে না আমি যে সমস্ত উদাহরণ দেখেছি তার মধ্যে ত্রুটিগুলি রুট হয়েছে। তাতে কি কিছু আসে যায় না?
ক্রিস্টোফার পেরি

7
মনে রাখবেন যে, এর কনস্ট্রাকটর OnErrorThrowableহয় privateএবং আপনি ব্যবহার করতে হবে OnErrorThrowable.from(e)পরিবর্তে।
ডেভিড.মিহোলা

আমি সবেমাত্র আপডেট করেছি। OnErrorThrowable.from (e) মানটি রাখবেন না, তাই আমি পরিবর্তে অনারআরথ্রোয়েবল.এডডিভ্যালুএলস্টকোজ (ই, ফাইল) ব্যবহার করি, যা মান রাখে।
dwursteisen

1
আমি কোড উদাহরণগুলি পছন্দ করি তবে আপনি যদি ফ্ল্যাটম্যাপ কলগুলির স্বাক্ষরটি কেবল স্ট্রিংয়ের পরিবর্তে পর্যবেক্ষণযোগ্য <স্ট্রিং> ফিরিয়ে দিতে আপডেট করেন তবে এটি সাহায্য করবে ... কারণ প্রযুক্তিগতভাবে এই দুটিয়ের মধ্যে পার্থক্য নেই?
রিচ এহমার

78

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

ব্যবহারিক অর্থে, ফাংশন মানচিত্রটি প্রয়োগ করে কেবল শৃঙ্খলাবদ্ধ প্রতিক্রিয়ার (কোনও পর্যবেক্ষনে প্রত্যাবর্তনযোগ্য নয়) পরিবর্তনের রূপান্তর ঘটায়; ফাংশন ফ্ল্যাটম্যাপ প্রয়োগ করার সময় একটি প্রদান করেObservable<T> , সেই কারণেই যদি আপনি পদ্ধতির অভ্যন্তরে অ্যাসিনক্রোনাস কল করার পরিকল্পনা করেন তবে ফ্ল্যাটম্যাপের পরামর্শ দেওয়া হয়।

সারসংক্ষেপ:

  • মানচিত্রে টি টাইপের একটি বস্তু প্রদান করে
  • ফ্ল্যাটম্যাপ একটি পর্যবেক্ষণযোগ্য ফেরত দেয়।

একটি সুস্পষ্ট উদাহরণ এখানে দেখা যাবে: http://blog.couchbase.com/why-couchbase-chose-rxjava-new-java-sdk

কাউচবেস জাভা ২ এক্স এক্স ক্লায়েন্টটি সুবিধাজনক উপায়ে অ্যাসিঙ্ক্রোনাস কল সরবরাহ করতে আরএক্স ব্যবহার করে। যেহেতু এটি আরএক্স ব্যবহার করে, এর পদ্ধতিগুলির মানচিত্র এবং ফ্ল্যাটম্যাপ রয়েছে, তাই তাদের ডকুমেন্টেশনের ব্যাখ্যা সাধারণ ধারণাটি বুঝতে সহায়তা করতে পারে।

ত্রুটিগুলি পরিচালনা করতে, আপনার সাসব্রাইবারে অনুলিপি ওভাররাইড করুন।

Subscriber<String> mySubscriber = new Subscriber<String>() {
    @Override
    public void onNext(String s) { System.out.println(s); }

    @Override
    public void onCompleted() { }

    @Override
    public void onError(Throwable e) { }
};

এটি এই দস্তাবেজটি দেখতে সহায়তা করতে পারে: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/

আরএক্স-এর মাধ্যমে ত্রুটিগুলি কীভাবে পরিচালনা করবেন সে সম্পর্কে একটি ভাল উত্স পাওয়া যাবে: https://gist.github.com/daschl/db9fcc9d2b932115b679


সংক্ষিপ্তসারটি ভুল। মানচিত্র এবং ফ্ল্যাটম্যাপ একই ধরণের ফেরত দেয় তবে তারা যে ফাংশন প্রয়োগ করে তা বিভিন্ন ধরণের রিটার্ন দেয়।
কক্সিয়ার

61

আপনার ক্ষেত্রে আপনার মানচিত্রের প্রয়োজন, যেহেতু কেবলমাত্র 1 টি ইনপুট এবং 1 আউটপুট রয়েছে।

মানচিত্র - সরবরাহিত ফাংশনটি কেবল কোনও আইটেম গ্রহণ করে এবং এমন আইটেম ফেরত দেয় যা আরও নিচে (কেবল একবারেই) নিঃসৃত হয়।

ফ্ল্যাটম্যাপ - সরবরাহিত ফাংশন কোনও আইটেম গ্রহণ করে তারপরে একটি "পর্যবেক্ষণযোগ্য" ফেরত দেয় যার অর্থ নতুন "পর্যবেক্ষণযোগ্য" এর প্রতিটি আইটেমটি আরও নিচে আলাদাভাবে নির্গত হয়।

কোড হতে পারে আপনার পক্ষে জিনিসগুলি পরিষ্কার হয়ে যাবে:

Observable.just("item1").map( str -> {
    System.out.println("inside the map " + str);
    return str;
}).subscribe(System.out::println);

Observable.just("item2").flatMap( str -> {
    System.out.println("inside the flatMap " + str);
    return Observable.just(str + "+", str + "++" , str + "+++");
}).subscribe(System.out::println);

আউটপুট:

inside the map item1
item1
inside the flatMap item2
item2+
item2++
item2+++

মানচিত্র ব্যবহার করা সেরা ধারণা কিনা তা নিশ্চিত নন, যদিও এটি কার্যকর হবে would মনে করুন ফাইলআরডারটি একটি অ্যাসিঙ্ক্রোনাস কল হয়ে গেছে। তারপরে আপনাকে মানচিত্রটি ফ্ল্যাটম্যাপে পরিবর্তন করতে হবে। এটিকে মানচিত্র হিসাবে রেখে যাওয়ার অর্থ হ'ল আপনি প্রত্যাশিত ঘটনাগুলি বরখাস্ত করবেন না এবং বিভ্রান্তির সৃষ্টি করবেন। আমি এখনও কয়েকবার কামড়েছি কারণ আমি এখনও আরএক্স জাভা শিখছি। আমি প্রত্যাশা করি যে ফ্ল্যাটম্যাপটি আপনার প্রত্যাশা অনুযায়ী জিনিসগুলি প্রক্রিয়াজাতকরণ নিশ্চিত করার একটি নিশ্চিত আগুনের উপায়।
ব্যবহারকারী 924272

24

আমি এটা আমার মনে হয় যে আপনার ব্যবহার করা হয় 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


1
এটি আমার পছন্দসই উত্তর। আপনি মূলত পর্যবেক্ষণযোগ্য কোনও পর্যবেক্ষনে বাসা বেঁধে শেষ করেন যদি আপনার পদ্ধতিটি কী ফিরে আসে।
ফিলিটি_উইজার্ড

21

প্রশ্নটি হল আপনি কখন আরএক্সজেবাতে মানচিত্র বনাম ফ্ল্যাটম্যাপ ব্যবহার করবেন? । এবং আমি মনে করি একটি সাধারণ ডেমো আরও নির্দিষ্ট।

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

তবে কোথাও কোথাও flatMapযাদু কাজ mapকরতে পারে কিন্তু পারে না। উদাহরণস্বরূপ, আমি একটি ব্যবহারকারীর তথ্য পেতে চাই তবে ব্যবহারকারী লগ ইন করার সময় আমাকে প্রথমে তার আইডিটি পেতে হবে vious স্পষ্টতই আমার দুটি অনুরোধ দরকার এবং সেগুলি ক্রমযুক্ত।

চল শুরু করি.

Observable<LoginResponse> login(String email, String password);

Observable<UserInfo> fetchUserInfo(String userId);

এখানে দুটি পদ্ধতি রয়েছে, একটি লগইনের জন্য ফিরে আসে Responseএবং অন্যটি ব্যবহারকারীর তথ্য আনার জন্য।

login(email, password)
        .flatMap(response ->
                fetchUserInfo(response.id))
        .subscribe(userInfo -> {
            // get user info and you update ui now
        });

আপনি যেমন দেখেন যে ফাংশনে ফ্ল্যাটম্যাপ প্রয়োগ হয়, প্রথমে আমি Responseতখন থেকেই ব্যবহারকারীর তথ্য আনব user দুটি অনুরোধ শেষ হয়ে গেলে, আমরা আমাদের কাজটি করতে পারি যেমন ইউআই আপডেট করা বা ডেটাবেসে ডেটা সংরক্ষণ করা।

তবে আপনি যদি ব্যবহার করেন তবে আপনি এই mapজাতীয় সুন্দর কোড লিখতে পারবেন না। এক কথায়, flatMapঅনুরোধগুলি ক্রমিকায়িত করতে আমাদের সহায়তা করতে পারে।


18

এখানে একটি সহজ বুড়ো আঙুলের নিয়ম যে আমি সাহায্যের হলে আমাকে ব্যবহার করতে যেমন সিদ্ধান্ত নেন ব্যবহার flatMap()উপর map()Rx এর Observable

একবার আপনি সিদ্ধান্তে এসেছেন যে আপনি কোনও mapরূপান্তর নিয়োগ করতে চলেছেন , আপনি কিছু অবজেক্ট ডান ফেরানোর জন্য আপনার রূপান্তর কোডটি লিখবেন?

আপনার রূপান্তরের শেষ ফলাফল হিসাবে আপনি যা ফিরিয়ে দিচ্ছেন তা হ'ল:

  • একটি অ-পর্যবেক্ষণযোগ্য অবজেক্ট তারপর আপনি কেবল ব্যবহার করতে চাইmap() । এবং map()সেই অবজেক্টটিকে একটি পর্যবেক্ষণযোগ্য মোড়ক করে এটিকে নির্গত করে।

  • একটি Observableঅবজেক্ট, তারপরে আপনি ব্যবহার করবেনflatMap() । এবং flatMap()অবজার্ভেবলকে মোড়ক করে, প্রত্যাবর্তিত বস্তুকে বাছাই করে, এটি তার নিজের পর্যবেক্ষণযোগ্য দিয়ে জড়িয়ে দেয় এবং এটিকে নির্গত করে।

উদাহরণস্বরূপ বলুন আমাদের কাছে একটি পদ্ধতি শিরোনামক্যাস রয়েছে (স্ট্রিং ইনপুটপাম) যা ইনপুট প্যারামের শিরোনামযুক্ত কেসড স্ট্রিং অবজেক্টটি প্রদান করে। এই পদ্ধতির রিটার্ন টাইপ হতে পারে Stringবা Observable<String>

  • যদি রিটার্নের titleCase(..)ধরণটি নিছক হয় Stringতবে আপনি ব্যবহার করবেনmap(s -> titleCase(s))

  • এর রিটার্ন টাইপ তাহলে titleCase(..)হতে ছিল Observable<String>, তাহলে আপনি ব্যবহার করতে চাইflatMap(s -> titleCase(s))

আশা করি তা স্পষ্ট হয়ে গেছে।


11

আমি কেবল এটির সাথে যোগ করতে চেয়েছিলাম flatMap, ফাংশনের অভ্যন্তরে আপনার নিজের কাস্টম অবজারভেবল ব্যবহার করার দরকার নেই এবং আপনি স্ট্যান্ডার্ড কারখানার পদ্ধতি / অপারেটরগুলির উপর নির্ভর করতে পারেন:

Observable.from(jsonFile).flatMap(new Func1<File, Observable<String>>() {
    @Override public Observable<String> call(final File file) {
        try {
            String json = new Gson().toJson(new FileReader(file), Object.class);
            return Observable.just(json);
        } catch (FileNotFoundException ex) {
            return Observable.<String>error(ex);
        }
    }
});

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


তবে আমি মনে করি মানচিত্র যথেষ্ট। তাই ফ্ল্যাটম্যাপ এবং মানচিত্র কি অভ্যাস ঠিক?
কক্সিয়ার

6

সেই দৃশ্যে মানচিত্রটি ব্যবহার করুন, এর জন্য আপনার কোনও নতুন পর্যবেক্ষণযোগ্য প্রয়োজন হবে না।

আপনার ব্যতিক্রমগুলি প্রকাশ করা উচিত ropপ্রোপাগেট, যা একটি মোড়ক যাতে আপনি এই পরীক্ষিত ব্যতিক্রমগুলি আরএক্স প্রক্রিয়াতে প্রেরণ করতে পারেন

Observable<String> obs = Observable.from(jsonFile).map(new Func1<File, String>() { 
    @Override public String call(File file) {
        try { 
            return new Gson().toJson(new FileReader(file), Object.class);
        } catch (FileNotFoundException e) {
            throw Exceptions.propagate(t); /will propagate it as error
        } 
    } 
});

আপনার তখন গ্রাহকের মধ্যে এই ত্রুটিটি পরিচালনা করা উচিত

obs.subscribe(new Subscriber<String>() {
    @Override 
    public void onNext(String s) { //valid result }

    @Override 
    public void onCompleted() { } 

    @Override 
    public void onError(Throwable e) { //e might be the FileNotFoundException you got }
};); 

এটির জন্য একটি দুর্দান্ত পোস্ট রয়েছে: http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/


0

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


0

ফ্ল্যাটম্যাপ মানচিত্রগুলি পর্যবেক্ষণযোগ্যগুলিতে পর্যবেক্ষণযোগ্য। আইটেম মানচিত্র মানচিত্র আইটেম।

ফ্ল্যাটম্যাপটি আরও নমনীয় তবে মানচিত্রটি বেশি লাইটওয়েট এবং সরাসরি, সুতরাং এটি আপনার ব্যবহারের উপর নির্ভর করে।

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

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