【问题标题】:get new ticket then retry first request获取新票,然后重试第一个请求
【发布时间】:2016-10-10 07:42:31
【问题描述】:

更新:

我扩展了Http类,当我deleteDocument()我想处理错误然后getTicket()然后用新的this.TICKET重试ma请求deleteDocument()

@Injectable()
export class HttpService extends Http {
    public SERVER_URL: string = 'http://10.0.0.183:8080/alfresco/s/'
    public TICKET: string = ''
    
    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) {
        super(backend, defaultOptions);
    }
    

    post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
        return this.intercept(super.post(url,body, options));
    }

    intercept(observable: Observable<Response>): Observable<Response> {
        return observable.catch(initialError => {
            if (initialError.status === 401) {
                return this.getTicket()
                    .do(res => {
                        // HERE I WANT RETRY MY FIRST REQUEST
                        this.TICKET = res.json().data.ticket
                    })
            } else {
                return Observable.throw(initialError);
            }
        })
    }

    getTicket() {
        return this.post(this.SERVER_URL + 'api/login', JSON.stringify({username: 'admin', password: 'admin'}))
    }


    deleteDocument(idFile: number) {
        return this.post(this.SERVER_URL + 'dms/file/delfile?idfile=' + idFile + '&alf_ticket=' + this.TICKET, {}).map((data: Response) => data.json())
    }
}

收到我的新票后,我想用新的 url 重试我的第一个请求。谢谢

【问题讨论】:

  • 您能否将您实际所在的代码添加到请求中?您的重试方法将是对查询方法的新调用,因此我们需要知道它的签名。
  • 请道歉,在这里(见更新)

标签: angular rxjs observable


【解决方案1】:

我不知道是否有更简单的方法,但我会使用 concatMap() 运算符并使用上一次调用返回的 id 递归调用 deleteDocument()

这应该模拟你的情况:

import {Observable} from 'rxjs';

function deleteDocument(willFail: bool, id) {
  return Observable.of("I'm your response: " + id)
    // process response and eventualy throw error
    .concatMap(val => {
      if (willFail) {
        return Observable.throw({response: val, message: "It's broken"});
      } else {
        return Observable.of(val);
      }
    })
    // recover from the error
    .catch(initialError => {
      return deleteDocument(false, initialError.response.length);
    });
}

deleteDocument(true, 42).subscribe(result => console.log(result));

观看现场演示:http://plnkr.co/edit/rUbLgEwtw7lSBueKJ5HN?p=preview

这会打印到控制台:

I'm your response: 21

我正在使用 willFail 参数模拟错误。操作员concatMap 服务器在这里区分错误和正确响应。我还将传递原始的id 并进行一些处理,仅用于演示目的。

在您的情况下,您还可以将重构原始 HTTP 请求所需的所有参数附加到 intercept(),而不是 this.getTicket().do() 使用:

return this.getTicket().concatMap(response => {
    var newBody = {id: response.ticketId};
    return this.post(originalUrl, newBody, ...);
});

运算符 do() 主要用于调试运算符链中发生的事情,它不会以任何方式修改链。

我不知道你的代码实际上做了什么,但我希望这对你有意义。

可能与您的问题类似:Observable Continue calling API and changing parameters based on condition

【讨论】:

    猜你喜欢
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多