1. ホーム
  2. angular

[解決済み] "rxjs" observable.throw は関数ではありません - Angular4

2022-02-11 13:19:56

質問

Angular 4を学んでいて、すべて順調に進んでいたのですが、あるサービスでcatchハンドリングを実装しようとしました。私は "rxjs" catch と throw を使おうとしていますが、コンソールに未定義の関数エラーが表示されます。

import { Injectable } from '@angular/core';
import { Http } from "@angular/http";
import { Observable } from 'rxjs/observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';
import { AppError } from "../app/common/app.error";
import { NotFoundError } from "../app/common/not-found-error";
import { BadInput } from "../app/common/bad-input";

@Injectable()
export class PostService {
  private url = "https://jsonplaceholder.typicode.com/posts";

  constructor(private http: Http) { }

 deletepost(post){
      // return this.http.delete(this.url + '/' + post.id)
      // Hard-coded id to test 404
      return this.http.delete(this.url + '/' + 93498)
        .catch((error: Response) => {
          console.log('error within catch is ' + Response)
          if(error.status === 404)
            return Observable.throw(new NotFoundError(error));

          return Observable.throw(new AppError(error));
        });
    }
}

これがエラーメッセージです。

TypeError: __WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw is not a function. 
(In '__WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw(new 
__WEBPACK_IMPORTED_MODULE_6__app_common_not_found_error__["a" /* NotFoundError 
*/](error))', 
'__WEBPACK_IMPORTED_MODULE_2_rxjs_observable__["Observable"].throw' is 
undefined) — post.service.ts:42

また、ブラウザでこのような警告が表示されます。

./~/rxjs/Observable.js
There are multiple modules with names that only differ in casing.
This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.
Use equal casing. Compare these module identifiers:
* /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/rxjs/Observable.js
    Used by 14 module(s), i. e.
    /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/@angular/core/@angular/core.es5.js
* /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/rxjs/observable.js
    Used by 1 module(s), i. e.
    /Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/node_modules/@ngtools/webpack/src/index.js!/Users/nickgowdy/Desktop/Angular2/angular4 source code/hello-world/src/services/post.service.ts

解決方法は?

エラー There are multiple modules with names that only differ in casing. を使おうとしているのは、間違ったインポートを対象にしていることを示しています。 Observable .

インポートは大文字の"O"のようにします。

import { Observable } from 'rxjs/Observable';

これは、個々の Observable 演算子と組み合わせて使用されます。 catch または throw を作成したObservableに追加します。

import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

Observableオブジェクトを完全にインポートするには、次のようにインポートします。

import { Observable } from 'rxjs/Rx'

更新しました。

RxJSの新しいバージョン(5.5以上)では、以下のような演算子があります。 map()filter() として使用することができます。 パイプ式演算子 との組み合わせで pipe() をチェーンするのではなく などとインポートされている。

import { filter, map, catchError } from 'rxjs/operators';

などの用語を覚えておきましょう。 throw はJavaScriptの予約語/キーワードなので、RxJSの throw 演算子としてインポートされます。

import { _throw } from 'rxjs/observable/throw';

更新しました。

RxJSの新しいバージョン(6+)では、こちらをご利用ください。

import { throwError } from 'rxjs';

というようなエラーを投げます。

if (error.status === 404)
    return throwError( new NotFoundError(error) )