如何在条件满足后进行http获取调用,如果不重试并再次以角度4调用

时间:2018-04-16 01:19:03

标签: angular reactjs

如果点击不同页面,我正在更新表单。我在不同的页面中列出了值。问题是在更改值之后,如果我单击列表页面,则在列表页面中进行调用时不会更新值。

例如:我在更新服务时有变量,即。 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);

}

2 个答案:

答案 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);
    });