1

私は現在、SQLデータベースから一連のデータをロードする必要があるWebアプリケーションを開発しています(一部の従業員や作業計画など)。コンポーネントにルーティングされるたびに、データを更新すると、サーバーに送信され、何らかの成功またはエラー メッセージが返されます。

現時点ではオブザーバブルを使用していますが、希望どおりに動作しません。オブザーバブルを購読し、データを受け取り、購読を解除します(購読を解除する場所もわかりません.onDestroyまたはComplete私のサブの一部ですか?)。しかし、コードの実行がすべてのデータを受信する前に続行され、アプリケーションでエラーが発生するため、何らかの形でまだ非同期です。

これが私の実装の例です:

従業員コンポーネント:

getEmployees(department: any){

this.employeesSub = this.employeeManagementService.getEmployees(department).subscribe(
          //Sucess
          data => {this.employees = data},
          //Error
          err => this.logger.error(err),
          //Complete
          () => {this.logger.log('done loading');
                }
    );
}
  ngOnInit(){

    this.selectedDepartment = this.ccs.getSelectedDepartment();
    //Does the same type of request as getEmployees()
    this.getDepartments();
    this.paramSub = this.route.params.subscribe(
        //Success    
        params => {    
            //doStuff
            }
        },
        //Error
        err => this.logger.error(err),
        //Complete
        () => {}
    );
}
  ngOnDestroy(){
      this.employeesSub.unsubscribe();
      this.paramSub.unsubscribe();
  }

従業員サービス:

getEmployees(department: string): Observable<Employee[]>{
    let method = "getEmployees";
    let body = JSON.stringify({method, department});
    this.logger.log(body);
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });

    return this.http.post(this.url, body, options)
                    .map((res:Response) =>{ 
                            this.logger.log(res.json());
                            return res.json();
                    }).catch(this.handleError);
}

これはここでよく聞かれるかもしれません。しかし、もっと多くの投稿を読んでも違いがわからないので、私はその違いについて本当に確信が持てません. 誰かが時間をかけて私を助けてくれませんか?

4

3 に答える 3

3

this._http.xxx()から返されたオブザーバブルは最初のイベントの後に閉じられ、いずれにせよサブスクリプションがキャンセルされるため、サブスクライブ解除は少し冗長です。

あなたの側でそれを確実にするために、あなたも使うことができますthis._http.xxx().first().subscribe(...). このようにして、送信者が発行しようとしているイベントの数に関係なく、最初のイベントの後にサブスクリプションが閉じられます。

応答を待たずにコードの実行が継続されるのは、非同期実行の性質であり、promise または observable を使用する場合と非常によく似ています。

データが到着した後にコードを実行する場合は、そのコードをsubscribe(...)map(...)またはその他の監視可能な演算子に移動する必要があります。

于 2016-08-22T14:14:49.797 に答える