কীভাবে আরএক্সজেএস মানচিত্র অপারেটর থেকে ত্রুটি নিক্ষেপ করা যায় (কৌণিক)


93

শর্তের ভিত্তিতে আমি আমার পর্যবেক্ষণযোগ্য মানচিত্র অপারেটর থেকে একটি ত্রুটি ফেলে দিতে চাই । উদাহরণস্বরূপ যদি সঠিক এপিআই ডেটা না পাওয়া যায়। দয়া করে নীচের কোডটি দেখুন:

private userAuthenticate( email: string, password: string ) {
    return this.httpPost(`${this.baseApiUrl}/auth?format=json&provider=login`, {userName: email, password: password})
        .map( res => { 
            if ( res.bearerToken ) {
                return this.saveJwt(res.bearerToken); 
            } else {
                // THIS DOESN'T THROW ERROR --------------------
                return Observable.throw('Valid token not returned');
            }
        })
        .catch( err => Observable.throw(this.logError(err) )
        .finally( () => console.log("Authentication done.") );
}

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

.subscribe(success, handleError)

কোনও পরামর্শ?


4
কি হবে throw 'Valid token not returned';?
গন্টার জ্যাচবাউয়ার

সংকলন করতে ব্যর্থ
হাসান

ঠিক ত্রুটি বার্তা দয়া করে।
গন্টার জ্যাচবাউয়ার

4
ওহ দুঃখিত, এটি কাজ করে না return throw 'message here'তবে returnকীওয়ার্ড ছাড়াই কাজ করে । এটি পরীক্ষা করে দেখি এটির যুক্তিযুক্তভাবে সঠিকভাবে কাজ করা হচ্ছে কিনা।
হাসান

subscribeপদ্ধতিতে ত্রুটির পাঠ্য পাওয়া যাচ্ছে না এবং .finally()প্রবাহে থাকাটিও ট্রিগার করে। (তবে ফাঁসি কার্যকর করা বন্ধ হয়ে গেছে যা একটি ভাল জিনিস)
হাসান

উত্তর:


141

map()অপারেটরের ভিতরে কেবল ত্রুটি নিক্ষেপ করুন । আরএক্সজেএস-এর সমস্ত কলব্যাক ট্রাই-ক্যাচ ব্লক দিয়ে মুড়িয়ে দেওয়া হয় যাতে এটি ধরা পড়ে এবং তারপরে একটি errorবিজ্ঞপ্তি হিসাবে প্রেরণ করা হয় ।

এর অর্থ আপনি কোনও কিছুই ফিরিয়ে দেন না এবং কেবল ত্রুটিটি ফেলে দেন:

map(res => { 
  if (res.bearerToken) {
    return this.saveJwt(res.bearerToken); 
  } else {
    throw new Error('Valid token not returned');
  }
})

throwError()(সাবেক Observable.throw()RxJS 5) যে শুধু একটি পাঠায় একটি লক্ষণীয় হয় errorপ্রজ্ঞাপন কিন্তু map()গ্রাহ্য না করে কি আপনি ফিরে যান। এমনকি যদি আপনি map()এটি থেকে কোনও পর্যবেক্ষণযোগ্য ফিরিয়ে দেন তবে তা nextবিজ্ঞপ্তি হিসাবে পাস করা হবে ।

শেষ কথা, আপনার সম্ভবত ব্যবহার করার দরকার নেই .catchError()( catch()আরএক্সজেএস 5 এর আগের )। যদি কোনও ত্রুটি ঘটে তখন আপনার কোনও পার্শ্ব প্রতিক্রিয়া সম্পাদন করার প্রয়োজন হলে এটি ব্যবহার করা ভাল tap(null, err => console.log(err))( do()উদাহরণস্বরূপ আরএক্সজেএস 5 এর আগে)।

জানুয়ারী 2019: আরএক্সজেএস 6 এর জন্য আপডেট হয়েছে


4
ধন্যবাদ @ মার্টিন - হ্যাঁ আপনার সমাধান কাজ করে। আমার লগআরর পদ্ধতিতে আমার আসলেই সমস্যা ছিল যা @ গন্তেরজ্যাচবাউয়ার নির্দেশ করেছেন। আমি returnএটি থেকে ত্রুটি বস্তু ছিল এবং এখন এটি পুরোপুরি কাজ করে :) ধন্যবাদ!
হাসান

@ মার্টিন: আপনি দয়া করে বিকাশ করতে পারবেন কেন আমরা আপনার কাছে চাই না? এখানে (ক্যাচ)?
বব

4
@ Bob কারণ ওপি catch()কেবল ত্রুটিটি লগ এবং পুনর্বিবেচনার জন্য ব্যবহার করছিল, যা আপনি অপ্রয়োজনীয় যদি কেবলমাত্র কোনও পার্শ্ব-প্রতিক্রিয়া সম্পাদন করতে চান (ত্রুটিটি লগইন করে) এবং কেবল এটি ব্যবহার করা সহজdo()
মার্টিন

4
এটি কি অভিন্ন return throwError(new Error('Valid token not returned'));?
সাইমন_উইভার

@ সিমন_উইভার না এটি নেই। return throwError()একটি প্রদান করে Observable<never>, এটি তত্ক্ষণাত পর্যবেক্ষণযোগ্য প্রবাহকে বাধাগ্রস্ত করে, একেবারেই না ফিরে without
মনিকা

25

আপনি যদি মনে করেন মত throw new Error()অ-পর্যবেক্ষণযোগ্য মত আপনি ব্যবহার করতে পারেন বলে মনে হয় throwError(...)সঙ্গে switchMapপরিবর্তে map(পার্থক্য হচ্ছে switchMapআয় একটি নতুন পর্যবেক্ষণযোগ্য):

// this is the import needed for throwError()
import { throwError } from 'rxjs';


// RxJS 6+ syntax
this.httpPost.pipe(switchMap(res => { 
   if (res.bearerToken) {
      return of(this.saveJwt(res.bearerToken)); 
   } 
   else {
      return throwError('Valid token not returned');  // this is 
   }
});

বা আরও সংক্ষিপ্তভাবে:

this.httpPost.pipe(switchMap(res => (res.bearerToken) ? 
                                    of(this.saveJwt(res.bearerToken)) : 
                                    throwError('Valid token not returned')
));

আচরণটি একই রকম হবে, এটি কেবল আলাদা সিনট্যাক্স।

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

রাখতে ভুলবেন না ofবা আপনি কিছু বিভ্রান্তিকর ত্রুটি বার্তা পাবেন।

এছাড়াও 'স্যুইচম্যাপ' এর সৌন্দর্য হ'ল আপনি চাইলে কমান্ডগুলির সম্পূর্ণ নতুন 'চেইন' ফিরিয়ে দিতে পারেন - যুক্তি যা কিছু করা দরকার তার জন্য saveJwt


4
একবার আমি switchMapএকটি অ্যাসিঙ্ক্রোনাস ifস্টেটমেন্ট হিসাবে ভাবতে শুরু করি - বিষয়গুলি আরও বেশি
অর্থবোধ করেছিল

3

যদিও এই প্রশ্নের উত্তর ইতিমধ্যে দেওয়া হয়েছে, আমি নিজের মতামতটি ভাগ করে নিতে চাই (যদিও এটি উপরে থেকে কিছুটা আলাদা)।

আমি ম্যাপিং থেকে পৃথক কী ফিরে আসবে তা ঠিক করব এবং তদ্বিপরীত। আমি নিশ্চিত নই যে এর জন্য অপারেটর কী সেরা, তাই আমি এটি ব্যবহার করব tap

this.httpPost.pipe(
  tap(res => { 
    if (!res.bearerToken) {
      throw new Error('Valid token not returned');
    }
  }),
  map(res => this.saveJwt(res.bearerToken)),
);

এর রিটার্ন মান tapউপেক্ষা করা হয়। এই কোডটি যা বলে তার থেকে আলাদা জিনিস করে
এসএফ

আমি এখনও rxjs অভ্যস্ত। সুইচম্যাপ ব্যবহার করা আরও ভাল হবে? কেউ অন্য কোনও অপারেটরের পরামর্শ দিতে বা সরাসরি সম্পাদনা করতে পারেন?
christo8989

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