###前提
AngularでWebアプリを開発している中での質問です。(超初心者です。)
test.component.tsではAngularのHttpClientを利用して
外部ネットワークに格納されているpageSize配列の0番目を取得し、
TestService側で宣言した"res"に格納しています。(TestService.tsのparamsGetPageSize)
その後、test.component.tsで取得したpageSize配列の0番目が格納された"res"を
TestService.tsのparamsGet関数で利用します。
###意図
TestService.tsのコードを見ていただければ分かる通り、
paramsGetPageSizeとParamsGetは
postParam = postParam.set('pageSize', ***);の***部分が固定値か、変数か以外に違いはありません。
pageSizeのような環境変数は外部に置いておき、それを読み込むようにしたいという意図があり、
pageSizeを読み込むための関数は固定値(仕方なし)、それ以外でparamsGet関数を利用する場合は、
取得した変数を用いる、という処理にしています。
このparamsGet関数は様々な場面で利用されます。
###質問
非同期なのが原因かと思いますが、test.component.tsで取得したpageSizeがresに格納される前に
TestService.tsのparamsGetが実行されてしまうため、resがundefinedのまま処理が進んでしまいます。
paramsGetが実行されるとき、resがundefinedの場合は値が格納されるのを待って処理を開始する、という方法があればご教授いただけないでしょうか。
よろしくお願いいたします。
###urlEncoder.ts
TypeScript
1import { HttpParameterCodec } from '@angular/common/http'; 2 3export class UrlEncoder implements HttpParameterCodec { 4 encodeKey(key: string): string { 5 return encodeURIComponent(key); 6 } 7}
###TestService.ts
TypeScript
1 2import { HttpClient, HttpParams } from '@angular/common/http'; 3import { UrlEncoder } from 'urlEncoder.tsのパス'; 4 5export class TestService{ 6 // test.component.tsから取得できるように宣言 7 public res = ""; 8 constructor(private http: HttpClient) { } 9 10 private setRequestParams(): HttpParams{ 11 let httpParams: HttpParams = new HttpParams({ encoder: new CustomURLEncoder() }); 12 httpParams = httpParams.set('hoge', '1'); //http://-----&hoge=1 になります。 13 } 14 15 paramsGetPageSize(path: string, postParams: any = {}): Observable<any> { 16 let postParam: HttpParams = this.setRequestParams(); 17 18 // 固定値を使用 19 postParam = postParam.set('pageSize', '100'); 20 return this.http.get(path, { params: postParam }); 21 } 22 23 paramsGet(path: string, postParams: any = {}): Observable<any> { 24 let postParam: HttpParams = this.setRequestParams(); 25 26 // test.component.tsで取得したthis.resを利用 27 postParam = postParam.set('pageSize', this.res); 28 return this.http.get(path, { params: postParam }); 29 } 30};
###test.component.ts
TypeScript
1import TestService from {'Service.tsのパス'}; 2 3@component{ 4 略 5} 6 7export class TestComponent implements OnInit{ 8 constructor( 9 private test: TestService, 10 ) 11 12 ngOnInit(){ 13 this.test.paramsGet('http://------').subscribe(res => { 14 this.response = res.pageSize[0] //外部インターネット上のpageSize配列の0番目を取得 15 // サービスのプロパティに代入 16 this.test.res = this.response; 17 } ); 18 19 this.test.paramsGet('*******').subscribe( 20 処理 21 ); 22 } 23 24}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。