如何在Angular 2中取消HTTPRequest?


69

如何在Angular 2中取消HTTPRequest?

我知道如何仅拒绝请求承诺。

return new Promise((resolve, reject) => {
    this.currentLoading.set(url, {resolve, reject});

    this.http.get(url, {headers: reqHeaders})
        .subscribe(
            (res) => {
                res = res.json();

                this.currentLoading.delete(url);
                this.cache.set(url, res);

                resolve(res);
            }
        );
});

Answers:


68

你可以打电话 unsubscribe

let sub = this.http.get(url, {headers: reqHeaders})
            .subscribe(
                (res) => {
                    res = res.json();

                    this.currentLoading.delete(url);
                    this.cache.set(url, res);

                    resolve(res);
                }
            );

sub.unsubscribe();

此处提供更多信息:http : //www.syntaxsuccess.com/viewarticle/angular-2.0-and-http


1
该答案在beta.15中不再有效。unsubscribe现在Observable中没有方法。
tom10271 '16

1
unsubscribe被替换为dispose
Menello

2
我正在使用Angular2的RC.5,并且unsubscribe存在(rxjs的5.0.0-beta.6版本)。也许自发表评论以来就恢复了?不确定差异来自何处。
道森·托特

@DawsonToth Angular 2团队很久没有更新rxjs了,它将在RC6中更新
Godfather

1
突然取消取消请求的取消订阅是什么?可能是什么问题?
布鲁诺·桑托斯

67

您可以使用以下简单解决方案:

if ( this.subscription ) {
   this.subscription.unsubscribe();
}
this.subscription = this.http.get( 'awesomeApi' )
 .subscribe((res)=> {
  // your awesome code..
})

3
与Angular 2.4.6一起使用时效果很好-这应该是公认的答案
Michail Michailidis

3
是否有可能可以通过做.toPromise()方法和then()catch()
Saeed Neamati

1
@SaeedNeamati为什么需要通过承诺来完成?
Ervin Llojku'6

2
此订阅的类型是什么?
Sunil Garg

@SunilGarg您是否要订阅:订阅;?
Ervin Llojku '17


6

晚会晚了一点,但是我的看法是:

import { Injectable } from '@angular/core'
import { Http } from '@angular/http'
import { Observable } from 'rxjs/Observable'
import { Subscriber } from 'rxjs/Subscriber'

@Injectable ()
export class SomeHttpServiceService {
  private subscriber: Subscriber<any>
  constructor(private http: Http){ }

  public cancelableRequest() {
    let o = new Observable(obs => subscriber = obs)
    return this.http.get('someurl').takeUntil(o)
      .toPromise() //I dont like observables
      .then(res => {
        o.unsubscribe
        return res
      })
  }
  public cancelRequest() {
    subscriber.error('whatever')
  }
}

这使您可以手动取消请求。有时我会以可观察到的结果或承诺来对页面上的结果进行更改。如果请求是自动启动的(用户未在x millis的字段中键入anyting),可以中止该请求很好(用户突然又在键入一些内容)...

如果您要查找的是,https: //www.learnrxjs.io/operators/filtering/takeuntil.html上的takeUntil也应该使用一个简单的超时(Observable.timer)。


1
您为什么不喜欢可观察物?对于http,它像promise一样,但是也有错误和完整的信息
Mick

@Mick,我认为clearfix只是在满足OP对诺言的偏爱,而不是表达他/她的意见。#theSpiritOfStackOverflow
Rap

2

使用switchMap [docs],它将取消所有正在进行的请求,并且仅使用最新的请求。

get(endpoint: string): Observable<any> {
        const headers: Observable<{url: string, headers: HttpHeaders}> = this.getConfig();
        return headers.pipe(
            switchMap(obj => this.http.get(`${obj.url}${endpoint}`, { headers: obj.headers, params: params }) ),
            shareReplay(1)
        );
    }

shareReplay将为任何后期订阅者发出最新的价值。


1
如果我没有任何可观察到的链接,该怎么办headers。我在按钮的单击上进行了http调用,但从文档中只能使用switchMap可观察到的
rainversion_3,2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.