4

我尝试使用 subscription.unsubsribe 取消挂起的 http 请求,如下所示:

getAgentList(pageNumber: number, filter: string): any {
   let requestUrl: string = 'api/service/agents_search?ACCT=' 
   +this.accountId;

if ( this.subscription ) {
    this.subscription.unsubscribe();
}

this.subscription =  this.backEndCommService.getData(requestUrl)
.subscribe(
        (res: any) => {
        let serverResponse: ServerResponse = new 
        ServerResponse(this.accountId, pageNumber, res.search_results, 
        res.resultRows, res.pageSize, res.resultPages)
                this._agentListData.next(serverResponse);
            },   
       (err: HttpErrorResponse) => {
                let errorMessage: string;
                if (err instanceof TypeError) {
                    errorMessage = 'Script error: ' + err.message;
                } 
                console.log(errorMessage);
    });
}

我想知道如何将 switchMap 应用于此代码以终止对 URL 的待处理请求(例如,当第一次搜索花费很长时间并且输入第二个搜索时自动完成搜索输入,我想关闭第一个。)谢谢

4

3 回答 3

9

基本示例:

export class MyComponent{
    private $filter: Subject<string> = new Subject<String>();

    constructor(){
        this.$filter
          .switchMap(filter => this.backEndCommService.getData(filter + this.baseUrl)
          .subscribe(res => {//do something})
    }

    getAgentList(filterValue: string){
        this.$filter.next(filterValue);
    }

}

要使用 switchmap 取消先前的请求,我们需要一个热的 observable 来输出我们的过滤器值。我们为此使用了一个主题。每次我们从某个地方得到一个新值?我们将其推向主题。

于 2018-03-07T13:47:20.460 回答
0

试过了,它甚至没有到服务器上

getAgentList(pageNumber: number, filter: string): any {
    let requestUrl: string = 'api/service/agents_search?ACCT=' 
  +this.accountId;
    if (filter) {
        requestUrl = requestUrl + '&filter=' + filter;
    }
    if (pageNumber) {
        requestUrl = requestUrl + '&pageNumber=' + pageNumber;
    }
    this.$filter.next(requestUrl)

    this.$filter.switchMap(requestUrl => 
    this.backEndCommService.getData(requestUrl))
            .subscribe(
                (res: any) => {
                    let serverResponse: ServerResponse = new 
                    ServerResponse(this.accountId, pageNumber, 
                    res.search_results, 
                    res.resultRows, res.pageSize, res.resultPages)
                    this._agentListData$.next(serverResponse);
                },
               (err: HttpErrorResponse) => {

            console.log('handling error');
      });
}

这一行 switchMap(requestUrl => this.backEndCommService.getData(requestUrl)) 没有拨打电话并无声落下.....mmmm

于 2018-03-07T15:54:48.470 回答
0

看起来问题是subscriptionnext. 把它想象成addEventListener在 DOM 上。添加侦听器(在本例中为订阅者)后,您会收到事件。

getAgentList(pageNumber: number, filter: string): any {
    let requestUrl: string = ‘...’

    // assuming this.$filter is a Subject
    // subscription to it first
    this.$filter.switchMap(requestUrl => this.backEndCommService.getData(requestUrl))
        .subscribe(
            (res: any) => {
                let serverResponse: ServerResponse = new 
                ServerResponse(this.accountId, pageNumber, 
                res.search_results, 
                res.resultRows, res.pageSize, res.resultPages)
                this._agentListData$.next(serverResponse);
            },
           (err: HttpErrorResponse) => {
                console.log('handling error')
           }
    );

    // then call next()
    this.$filter.next(requestUrl)
}

大概就是这样。除非,this.$filter是 BehaviorSubject 或 ReplaySubject,否则我们可能会遇到不同的问题。

于 2018-03-10T23:22:12.710 回答