如果点击不同页面,我正在更新表单。我在不同的页面中列出了值。问题是在更改值之后,如果我单击列表页面,则在列表页面中进行调用时不会更新值。
例如:我在更新服务时有变量,即。 saveFunction。更新后,saveFuction = null。
在列出服务电话中,
返回this.http.get(${this.url}netwealth
,this.requestOption)
.map((r:Response)=> r.json());
我想检查变量saveFunction是否为null,然后在列表服务中调用http.get,如果没有延迟一段时间再试一次。我能够获得saveFunciton变量。在下面的代码中,我在检查条件之前执行http.get。由于这个http.get被多次调用。我正在寻找如何检查条件,然后做http.get。
public GetNetWealth(): Observable<any> {
return Observable.create((o: Observer<any>) => {
let saveFunction = this.detailService.savefunction;
this.http.get(`${this.url}netwealth`, this.requestOption)
.map((r: Response) => r.json())
.subscribe((result) => {
if (saveFunction) {
setTimeout({}, 2000);
o.error('retry');
} else {
o.next(result);
o.complete();
}
},
error => o.error(error)
);
}).retryWhen((errors) => {
return errors.map(error => {
return true;
}
);
}).delay(1000);
}
答案 0 :(得分:0)
您可以尝试使用while循环,因为没有其他方法可以等待JS执行。
isInProgress: boolean = false;
listing(netwealth) {
while(this.isInProgress) {
// Do nothing
}
this.isInProgress = true;
return this.http.get(${this.url}netwealth, this.requestOption)
.map((r: Response) => {
return r.json();
this.isInProgress = false;
});
}
但更好的是,如果您可以使用Subject
&amp;重新设计您的实施方案Observable
。
解决方案2
isInProgress: boolean = false;
inProgresssubject = new Subject<any>();
let pendingRequests: any[] = [];
updateIsProgress(value) {
this.inProgresssubject.next(value);
}
getUpdateProgress(): Observable<any> {
return this.inProgresssubject.asObservable();
}
this.getUpdateProgress().subscribe(isInProgress => {
this.isInProgress = this.isInProgress || isInProgress;
if(!this.isInProgress && pendingRequests.length > 0) {
let newValue = this.pendingRequests.shift();
// Update newValue on server && also call this.updateIsProgress(true);
}
});
updateDataOnServer(newValue) {
if(isInProgress) {
this.pendingRequests.add(newValue);
} else {
// Update newValue on server && also call this.updateIsProgress(true);
}
}
第二个解决方案没有完成,但会告诉您如何继续。
答案 1 :(得分:0)
我能够验证条件,然后使用Observables调用http.get。
return Observable.create((o: Observer<any>) => {
let isCompleted = this.detailService.hasLastSaveCompleted;
if (!isCompleted) {
o.error('prevSaveNotCompleted');
} else {
this.http.get(`${this.url}test`, this.requestOption)
.map((r: Response) => r.json())
.subscribe((result) => {
o.next(result);
o.complete();
},
error => o.error(error)
);
}
}).retryWhen((errors) => {
return errors.map(error => {
if (error !== 'prevSaveNotCompleted') {
throw new Error(error);
}
return true;
}).delay(200);
});