web-dev-qa-db-ja.com

Angular 4観察可能なボイドを正しく返す方法

私のAngular 4アプリケーションでは、オブザーバブルを返す必要があるメソッドがあり、このメソッドには3つの条件があり、最初と2番目の条件はget呼び出しを行いますが、3番目の条件は何もせずにこの場合、このメソッドは_.flatmap_演算子の最初の部分であるため、observableも返す必要があります。したがって、flatmapの2番目の部分をチェーンするには、最初の部分からobservableが必要です。

return new Observable<void>();で試してみましたが、このエラーがあります:

エラーTypeError:未定義のプロパティ 'subscribe'を読み取れません

これは、データをロードするためにサービスを呼び出す必要がある初期メソッドです。

_loadModelData() {
      this.customerService.getModelDetail(this.code)
        .subscribe(response => {
          this.selected = response.body as Customer;
        });
    }
  }
_

これは、2つの呼び出しをチェーンする必要があるサービスメソッドです。

_getModelDetail(code) {

    const params = new HttpParams().set('projection', 'withBalance');

    return this.endPointUrlService.loadMaps(this.entityLink)

      .flatMap((res) => {
        return this.http.get(this.endPointUrlService.cutLinks(
          this.endPointUrlService.map.get('customers')) + '/' + code, {observe: 'response', params: params})
          .map((response) => <any>response);
      })
  }
_

そして、これはendPointUrlServiceと呼ばれるサポートサービスからのメソッドであり、checkIfMapIsReady()は3番目のケースで観察可能なボイドを返す必要があるメソッドです

_  loadMaps(entityLink: EntityLink[]): Observable<void> {
    console.log(entityLink);

    for (const i in entityLink) {
      if (entityLink.hasOwnProperty(i)) {
      return this.checkIfMapIsReady(entityLink[i].name, entityLink[i].searchMap, entityLink[i].endPoints[0])
      }
    }
  }


  public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {

    if (this.map.get(modelName) === undefined) {
      console.log('endpoint url service All maps undefined ' + modelName);
      return this.getLinks(modelName, this.mapNames.get(mapName), false)
    } else {
      console.log('endpoint url service Populate only ' + mapName);
      if (this.mapNames.get(mapName).get(endPoints) === undefined) {
      return  this.getLinks(modelName, this.mapNames.get(mapName), true)
      } else {
        return new Observable<void>();
      }
    }
  }
_
17
Alessandro

_Observable<void>_タイプに一致するオブザーバブルは

_Observable.of();
_

結果は値なしで完全に観測可能になり、Observable.empty()に似ています。

ながら

_new Observable<void>();
_

それはサブスクライブ関数の引数がないため、間違っています。代わりに:

_new Observable<void>(observer => observer.complete());
_
5
Estus Flask

おそらくObservable.empty()は値を出力しないため、より良いオプションです。下流のオペレーターは、返される値に問題を抱えることはありません!

下流のflatMap(res => ...)およびsubscribe()はトリガーされないことに注意してください。
resを使用していないので、これが望ましい効果だと思いますか?

適切に測定するには、戻り値の型を_Observable<any>_にします。

I thinkこれは論理的に投稿されたcheckIfMapIsReady()と同等です。

_public checkIfMapIsReady(modelName: string, mapName: string, endPoints: string) {

  const map = this.map.get(modelName);
  const name = this.mapNames.get(mapName);
  const endPointCheck = name ? name.get(endPoints) : null;

  const links = !endPointCheck 
    ? this.getLinks(modelName, name, !!map)     // !! gives boolean true or false
    : Observable.empty();

  const msg = !map 
    ? 'endpoint url service All maps undefined ' + modelName
    : 'endpoint url service Populate only ' + mapName
  console.log(msg);    

  return links;
);
_
3
Richard Matsen

振る舞いのオブザーバブルを使用できます。それらには初期値があり、サブスクライブすると、サブスクリプションはその初期値で動作します。 3番目の条件が当てはまる場合、Customerの新しいインスタンスを操作したい場合、次のようにします。

`

_let customer = new Customer();
let subj = new BehaviorSubject<Customer>(customer);
....
if(thirdcondition){
  return subj;
}
_

`

したがって、このメソッドでsubscribe()を呼び出し、その最後のブロックが実行されると、必要なものが得られます。 new customer()をデフォルトで必要なものに変更できます。

0
Fatemeh Majd