在rxJS angular2中,我可以在retryWhen后调用retry吗

在rxJS angular2中,我可以在retryWhen后调用retry吗,angular,typescript,rxjs,Angular,Typescript,Rxjs,我想在retryWhen之后调用retry,但它不起作用,我如何在retryWhen之后调用相同的observable。我的代码没有到达重试位置 getStatuses(statuses : string[]): Observable<IStatus[]> { let body = JSON.stringify({ "Statuses": statuses }); let headers = new Headers({ 'Content-Type': 'applica

我想在retryWhen之后调用retry,但它不起作用,我如何在retryWhen之后调用相同的observable。我的代码没有到达重试位置

getStatuses(statuses : string[]): Observable<IStatus[]> {
    let body = JSON.stringify({ "Statuses": statuses });
    let headers = new Headers({ 'Content-Type': 'application/json' });
    headers.append('Authorization', 'Bearer' + localStorage.getItem("access_token");
    headers.append('Access-Control-Allow-Origin', '*');
    let options = new RequestOptions({ headers: headers });
    return this.http.post(this._baseUrl + '/statuses/statusesList', body, options)
               .retryWhen(error => this.refreshToken(error)).retry(3)
                .map((res: Response) => {
                    this.inspections = res.json();
                    return this.inspections;
                });
}
getStatuses(statuses:string[]):可观察{
let body=JSON.stringify({“Statuses”:Statuses});
let headers=新的头({'Content-Type':'application/json'});
headers.append('Authorization','Bearer'+localStorage.getItem(“access_token”);
headers.append('Access-Control-Allow-Origin','*');
let options=newrequestoptions({headers:headers});
返回this.http.post(this._baseUrl+'/statuses/statusesList',body,options)
.retryWhen(错误=>此.refreshToken(错误))。重试(3)
.map((res:Response)=>{
this.inspections=res.json();
将此文件退回。请检查;
});
}
下面是一个函数

refreshToken(错误$:any):可观察{
返回错误$.flatMap((错误:error)=>{
console.log(“刷新令牌”);
const body:string='grant\u type=refresh\u token&refresh\u token='+
getItem(“刷新令牌”);
常量头=新头();
headers.append('Content-Type','application/x-www-form-urlencoded');
const options=newrequestoptions({headers:headers});
//正常进行刷新调用
返回此.http.post('https://loginqa.test.com/as/token.oauth2,正文,选项)
}).map((res:Response)=>{
返回res.json();
})
.do((响应)=>{
var resultsToken=resp.json();
警报(“测试刷新令牌”);
localStorage.removietem('access_token');
removietem('refresh_token');
setItem(“access\u token”,resultsToken.access\u token);
setItem(“刷新令牌”,resultsToken.refresh\u令牌);
}

问题在于您的
refreshToken
函数实际上没有处理或发出错误。这是它需要执行的操作,才能到达
重试

subscribe
块中,您没有订阅
throw
操作符,因此错误永远不会出现

我将重构
refreshttoken
,以便在失败时实际发出错误

// Pass in the error stream so you are actually processing when there is an
// exception
refreshToken(error$): Observable<any> {

  return error$.flatMap(err => {
    console.log("refreshing token");
    const refreshToken = localStorage.getItem('refreshToken');
    const body: string = `grant_type=refresh_token&refresh_token=${refreshToken}`;
    const headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');

    const options = new RequestOptions({ headers: headers });

    // Make the refresh call as normal
    return this.http.post('https://fedqa.test.com/as/token.oauth2', body, options);
  })
  .map(res => res.json())
  .do(resp => {
    // If there is no error, this will emit a next value
    // and which will trigger the retry
    // An error triggers, then this will not run and the retryWhen
    // will skip ahead to the retry operator.
    localStorage.removeItem('access_token');
    localStorage.removeItem('refresh_token');
    localStorage.setItem("access_token", resp.access_token);
    localStorage.setItem("refresh_token", resp.refresh_token);
    localStorage.setItem("expires_in", resp.expires_in);
  });


}

refreshToken
返回什么?@palpdaniels我更新了我的问题。请检查您是否可以更新到最新的代码或创建一个显示错误的jsbin?@user3154990您没有从
map
操作符返回任何内容。然后您尝试调用
json()
在未定义的值上,这样您的代码就会跳出
retryWhen
并直接进入
retry
。您需要执行
.map(resp=>{return resp.json();})
如果您不使用内联函数。即使在map函数中返回数据,我仍然会收到相同的错误。再次更新我的问题…您正在尝试读取
json()
来自
do
中的resp,但它没有该方法,您已经在中解析了它map@pauldaniels..everything很好,但重试次数无限。请查看我的最新问题,以便致电function@pauldaniels…是否需要调用return Observable.Next()从do?此函数正在执行重试中的错误并进入无限循环..我无法控制要调试和查看的重试…但函数没有拾取由refresh_token()方法返回的access_token并再次执行retryWhen并进入无限循环。
// Pass in the error stream so you are actually processing when there is an
// exception
refreshToken(error$): Observable<any> {

  return error$.flatMap(err => {
    console.log("refreshing token");
    const refreshToken = localStorage.getItem('refreshToken');
    const body: string = `grant_type=refresh_token&refresh_token=${refreshToken}`;
    const headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');

    const options = new RequestOptions({ headers: headers });

    // Make the refresh call as normal
    return this.http.post('https://fedqa.test.com/as/token.oauth2', body, options);
  })
  .map(res => res.json())
  .do(resp => {
    // If there is no error, this will emit a next value
    // and which will trigger the retry
    // An error triggers, then this will not run and the retryWhen
    // will skip ahead to the retry operator.
    localStorage.removeItem('access_token');
    localStorage.removeItem('refresh_token');
    localStorage.setItem("access_token", resp.access_token);
    localStorage.setItem("refresh_token", resp.refresh_token);
    localStorage.setItem("expires_in", resp.expires_in);
  });


}
.retryWhen(error$ => this.refreshToken(error$)).retry(3);