2016-12-21 2 views
4

私はいくつかのRx.Observableチュートリアルの後にAngular 2アプリケーションからオートコンプリートシステムを使用しています。ValueChangesはRx.Observableでエラーが発生するとすぐに機能しなくなります

フィールドに入力すると、valueChangesイベントがAngular 2 FormControlから発生します。

これはJSONエンドポイントに対してHTTPリクエストを作成するObservableに連鎖されています。

エンドポイントが404ステータスを返す瞬間、valueChangesイベントは動作を停止します。

私のサブスクライブ方法でエラーが表示されることがありますが、復旧して続けるのが最善の方法であるかどうかは本当にわかりません。

KeyUpイベントまたはValueChangeイベントの発生がなぜ停止するのか少し混乱しています。

サンプル値の変更 - 観察可能なチェーン

this.userNameControl 
    .valueChanges 
    .do(r => { 
      // As soon as a 404 status is thrown from getGitHuybUser$, all value change (keyup) events stop working 
      console.log 
     } 
    ) 
    .switchMap(userName => { 
     return this.getGitHubUser$(userName); 
    }) 
    .catch(err => { 
     return Observable.of(err) 
    }) 
    .subscribe(v => { 
      console.log(v); 
     }, 
     (err) => { 
      // As soon ass there is a 404 status, I end up here 
      console.log(err); 
     }, 
     () => { 
      console.log('Complete'); 
     }); 

getGitHubUser$(username) { 
    return this.http 
     .get(`https://api.github.com/users/${username}`) 
} 

HTMLフォームコントロール

<input type="text" [value]="userName" [formControl]="userNameControl" /> 

私はキャッチにObservable.empty()とObservable.neverを()を返すみました

.catch(err => { 
    // Observable.of(err) 
    // return Observable.empty(); 
    return Observable.never(); 
}) 

結果はsubscribeメソッドは私のcompleteメソッドと呼ばれていたので、valueChangesはまだ起動しません。

+1

のハングするのに必要な.switchMap()でぶら下がっていた私の問題、.catch()を考え出しました。エラーを除外して何とか再試行するか、または再登録する必要があります。 –

答えて

2

は、私は本当にサブスクリプションは、すぐにエラーが発生したとして終了this.getGitHubUser$(userName)

this.userNameControl 
    .valueChanges 
    .do(r => { 
      // As soon as a 404 status is thrown from getGitHuybUser$, all value change (keyup) events stop working 
      console.log(r); 
     } 
    ) 
    .switchMap(userName => { 
     console.log('GET GIT HUB USER'); 

     return this.getGitHubUser$(userName) 
      .catch(err => { 
       console.log('CATCH INNER'); 
       console.log(err); 
       return Observable.of(err) 
      }) 
    }) 
    // .catch(err => { 
    //  // THIS CODE IS NOT NEEDED 
    //  console.log('CATCH'); 
    //  console.log(err); 
    //  return Observable.never(); // Observable.of(err) 
    // }) 
    .subscribe(v => { 
      console.log('SUCCESS'); 
      console.log(v); 
     }, 
     (err) => { 
      console.log('ERROR'); 
      console.log(err); 
     }, 
     () => { 
      console.log('COMPLETE'); 
     }); 
+0

PS。あなたの解決策は私の問題を解決しましたが、私はそれを否定しません。 私は同様の問題を抱えていましたが、私の場合はキャッチをまったく使用していませんでした。サブスクライブで2番目の引数を使用してエラーを処理していました。最初のイベント、すなわち最初の値の変更に対しては正常に機能しました。しかし、エラーが発生した後は、その後は動作しませんでした。これが起こる正確な理由を知っていますか? – user2049132

+0

サブスクライバ内のエラーハンドラが完了として機能し、オブザーバブルの動作が停止します。これは設計によるものです。エラーが発生しても観測可能な状態で発光し続けるようにするには、catchブロック内のエラーを処理し、Observableをエラーではないものを放出する必要があります。 – Looted

関連する問題