最初にPOST何かであるサービスを呼び出す必要があるコンポーネントがあります。次に、同じコンポーネントでPOSTが完了するまで待って、データを取得する別のサービス。
POST呼び出しが終了するまでGET呼び出しを待機させるにはどうすればよいですか?
New-version.component.tsで:
private createNewVersion(value) {
...
// create new version, then call on all available versions
// POST call
this._newVersionService.createNewVersion(vnr);
// GET call
this._versionService.getAvailableVersions();
...
}
New-version.service.tsで:
export class NewVersionService {
response$: Subject<any>;
constructor(private _http: Http) {
this.response$ = new BehaviorSubject<any>(null);
}
public createNewVersion(versionNr) {
this._http.post('http://localhost:8080/services/' + versionNr, null, {
method: 'POST',
})
.subscribe(response => {
this.response$.next(response.status);
},
error => console.error(error));
}
ありがとう!
呼び出しがPromise
チェーンを返すとき、呼び出しは
someFunction() {
return returnsPromise()
.then(result => doSomethingNext())
.then(result => doSomethingAfterThat());
}
そのチェーンのreturn
を返すPromise
があることを確認してください。someFunc()
の呼び出し元にも、doSomethingAfterThat()
の後に実行する追加の作業の時間を計る機会があります。完了しました。
呼び出しがObservable
を返す場合、complete
コールバックを使用します
someFunction() {
return returnsObservable()
.subscribe(
event => doForEachEvent(),
error => handleError(),
() => doSomethingNext()
.then(result => doSomethingAfterThat());
}
doSomethingNext()
は最後のevent
の後に実行され、doSomethingAfterThat()
は再びthen()
とチェーンされて、オブザーバブルとプロミスを混合する方法を示します。 doSomething()
。
シーケンスを実現するにはconcat
を、放出された値を収集するにはreduce
を実行できる必要があります。
var a = this._newVersionService.createNewVersion(vnr);
var b = this._versionService.getAvailableVersions();
Rx.Observable.concat(a, b).reduce((acc:Array<any>, x:any) => {
acc.Push(x); return acc;
}, []).subscribe(t=> {
var firstEmitted = t[0];
var secondEmitted = t[1];
});
次のように実行できます。createNewVersionを次のように変更します。
public createNewVersion(versionNr) {
return this._http.post('http://localhost:8080/nod_inspection_plugin/services/' + versionNr, null, {
method: 'POST',
});
}
その後、あなたの電話で:
this._newVersionService.createNewVersion(vnr).subscribe(response=> {
this._versionService.getAvailableVersions();
}, error => console.error(error));
同じことを行う別の方法は、new-version.component.ts
でsubscribe
を実行し、GET
リクエスト内からPOST
リクエストを呼び出すことです。つまり、POST
要求は正しく行われるかどうかはいPOST
が正しく行われたら、GET
要求を呼び出します。以下のように:
New-version.component.tsで:
private createNewVersion(value) {
...
// create new version, then call on all available versions
// POST call
this._newVersionService.createNewVersion(vnr)
.subscribe((res) => {
if(res){
console.log(res);
if (---Post request done properly check via status or something else here----{
CALL YOUR GET REQUEST HERE.....
// GET call
this._versionService.getAvailableVersions();
}
else {
DO something else whatever you want....
}
}
});
...
}
New-version.service.tsで:
export class NewVersionService {
response$: Subject<any>;
constructor(private _http: Http) {
this.response$ = new BehaviorSubject<any>(null);
}
public createNewVersion(versionNr) {
this._http.post('http://localhost:8080/nod_inspection_plugin/services/' + versionNr, null, {
method: 'POST',
})
.map(response => {
return [{status: response.status, json: response.json()}];
},
error => console.error(error));
}
http
リクエストに関連する詳細については、 ここを読む を使用できます。
ここではswitchMap()
を使用することをお勧めします。
const versions$ = this._newVersionService.createNewVersion(vnr)
.switchMap(response => this._versionService.getAvailableVersions());
versions$.subscribe(response2 => this.versions = response2)
しかし、問題は、最初に解決される前に別のPOST=要求を行うと、前の要求がキャンセルされることになります。