2017-11-19 20 views
1

次のコードは、約束の解像度をtrueに、そして約束のエラーをfalseに効果的に割り当てます。私は私が必要以上の仕事をやっているようRxJS:約束の結果をマップし、異なる値に約束するエラー

onlineUpdate$ 
.switchMap(online => { 
    switch (online) { 
    default: 
    case true: { 
     const connected$ = new Rx.Subject(); 
     axios.get("/some/url/to/test/connection") 
     .then(response => connected$.next(true)) 
     .catch(error => connected$.next(false)); 
     return connected$; 
    } 
    case false: { 
     return Rx.Observable.of(false); 
    } 
    } 
}); 

しかし、中間Rx.Subjectの作成について何かを感じています。 1つの値に約束の解決をマップし、中間のRx.Subjectまたは他の観測値を使用せずに別のものにエラーを約束するための、よりエレガントなまたは組み込みの方法がありますか?

+0

、私はまだ[ 'をお勧めします。それから、(...、...) 'over' .then(...).catch(...) '](https://stackoverflow.com/q/24662289/1048572) – Bergi

答えて

0

Observable.fromPromise()をまったく使用する必要はありません。この作業を行うための最も簡単な変更は次のとおりです。

onlineUpdate$ 
.switchMap(online => { 
    switch (online) { 
    default: 
    case true: { 
     return axios.get("/some/url/to/test/connection") 
     .then(response => true) 
     .catch(error => false); 
    } 
    case false: { 
     return Rx.Observable.of(false); 
    } 
    } 
}); 

それとも、あなたはswitch文の上に三元系を好む場合:あまりないが起こることができ、この特定のケースでいる間

onlineUpdate$ 
.switchMap(online => { 
    return online ? 
    axios.get("/some/url/to/test/connection") 
     .then(response => true) 
     .catch(error => false) 
    : Rx.Observable.of(false); 
}); 
3

約束をObservable#fromPromise関数を介して観測可能にラップし、約束を渡します。それは

... 
case true: { 
     return Rx.Observable.fromPromise(axios.get("/some/url/to/test/connection") 
              .then(response => true) 
              .catch(error => false)); 
    } 
... 

簡単な例拒否された場合の約束が解決またはfalseされている場合に観察はtrueを放出します。

Rx.Observable.of(false)は、case falseに相当します。 Promise.resolve(true)then約束の機能とPromise.reject('Error').catch(err => false)catch約束の機能。

Rx.Observable.of(false).subscribe(console.log); 
 
Rx.Observable.fromPromise(Promise.resolve(true)).subscribe(console.log); 
 
Rx.Observable.fromPromise(Promise.reject('Error').catch(err => false)).subscribe(console.log);
<script src="https://unpkg.com/@reactivex/[email protected]/dist/global/Rx.js"></script>

+1

答えのおかげで、@シュレン。これは本当に私がRx.Subject()を取り除くのを助けました。しかし、 'flatmap'や' switchMap'では 'Observable.fromPromise'の使用は不要です。 –

1

はい、あなただけのObservable.fromPromise()のcatchブロックでObservable.of(false)を返すことができます。賢明には、.map()を使用して接続が成功した場合はObservable.of(true)を返します。

onlineUpdate$ 
    .switchMap(online => { 
     switch (online) { 
      default: 
      case true: { 
       Rx.Observable.fromPromise(axios.get("/some/url/to/test/connection")) 
        .map(() => true) // if the promise resolves to something, return an Observable.of(true) 
        .catch(() => Rx.Observable.of(false)) // else if there is any error return Observable.of(false) 
      } 
      case false: { 
       return Rx.Observable.of(false); 
      } 
     } 
    }); 

あなたはpromiseが正常に解決するかどうかを明示的にtrueにObservable.fromPromise.map()する必要が注意してください。

あなたがはるかに簡潔な方法でコードを書くことができます。

onlineUpdate$ 
    .switchMap(online => { 
     return online ? 
      Rx.Observable.fromPromise(axios.get("/some/url/to/test/connection")) 
       .map(() => true) 
       .catch(() => Observable.of(false)) 
      : Observabe.of(false) 
    }); 
1

Observable inputいわゆるでswitchMapオペレータはあなただけの観測にそれを回すことなく、約束を返すことができることを意味している作品:

onlineUpdate$ 
.switchMap(online => { 
    switch (online) { 
    default: 
    case true: { 
     return axios.get("/some/url/to/test/connection"); 
    } 
    case false: { 
     return Rx.Observable.of(false); 
    } 
    } 
}) 
.catch(() => Rx.Observable.of(false)) 
.map(Boolean) // force convert to boolean 

これはあなたが書いたものと同じではないことにご注意ください。 catchオペレータは、前のaxios.getコールから来ていない場合でもすべてのエラーをキャッチしますが、場合によっては問題ではありません。

関連する問題