TypeErrorが発生しました。ストリームが期待されるところを、無効なオブジェクトを提供しました。Observable、Promise、Array、Iterableのいずれかを指定できます。
サービスコールから map
を実行しようとしていますが、エラーが発生します。
https://stackoverflow.com/questions/41995647/subscribe-is-not-defined-in-angular-2 を見てみると、サブスクライブするためには、演算子の中からリターンする必要があると書かれていました。returnステートメントもあります。
以下が私のコードです。
checkLogin(): Observable<boolean> {
return this.service.getData()
.map(
response => {
this.data = response;
this.checkservice = true;
return true;
},
error => {
// debugger;
this.router.navigate(['newpage']);
console.log(error);
return false;
}
)
.catch(e => {
return e;
});
}
エラーログです。
TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable
49
3
あなたのサンプルコードでは、
map
演算子が1つのコールバックしか受け取らないはずなのに、2つのコールバックを受け取っています。エラー処理のコードをcatchコールバックに移すことができます。また、
catch
とthrow
の演算子をインポートする必要があります。EDIT: キャッチハンドラで
Observable.throw
を返すことで、実際にはエラーを捕捉することはできませんが、コンソールにはエラーが表示されます。あなたのコードはObservableを返していますが、あなたのコードはただのbooleanを返しています。そのため、以下のようにする必要があります。
もし、他の一般的なサービス
checkservice
を使用している場合は、単にこれにより、
checkLogin()
関数の戻り値を void にすることができます。そして、
this.checkService
を使って条件をチェックすることができます。ユニットテストを行っているときに、まったく同じエラーメッセージが表示され、サービスをモックした後に観察可能な例外が発生しました。
私は
Observable.throw
に正確な関数とフォーマットを渡すことで解決しました。サービスを呼び出し、データを取得するために
subscribe
を行う実際のコードです。400
エラーを処理するためのcatch
に注目してください。サービス内部のコード
ユニットテスト
SomeServiceをモックしてobservableデータを返してみましたが、必要なメソッドがすべて入っているので問題ありません。
上記のコードは問題ありませんが、
Observable.throw({})
を渡してキャッチ/エラー条件をテストしようとしたとき、サービスからResponse
タイプのリターンを期待していたため、エラーが表示されました。そのため、以下のサービスのモックリターンではエラーが発生していました。
そこで私は、
Response
型の値を渡すのではなく、期待される関数をそのままreturnオブジェクトで再現することで修正しました。