如何在Angular 2中取消HTTPRequest?

时间:2016-04-08 03:19:29

标签: http promise angular

如何在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);
            }
        );
});

5 个答案:

答案 0 :(得分:52)

您可以致电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 :(得分:40)

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

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

答案 2 :(得分:6)

派对有点晚了,但这是我的看法:

NSError *errorJSON = nil;
NSDictionary *myJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&errorJSON];
if (errorJSON)
{
    NSLog(@"Oops error JSON: %@", errorJSON);
}
NSDictionary *data = myJSON[@"data"];
NSArray *journalList = data[@"journalList"]
for (NSDictionary *aJournalDict in journalList)
{
    NSUInteger amount = [aJournalDict[@"journal_amount"] integerValue];
    NSString *code = aJournalDict[@"journal_code"];
}

这允许您手动取消请求。我有时会得到一个可观察或承诺,它会对页面上的结果进行更改。如果请求是自动启动的(用户没有在x millis的字段中输入任何内容)能够中止请求很好(用户突然再次输入内容)......

takeUntil也应该使用简单的超时(Observable.timer),如果你正在找的那个 https://www.learnrxjs.io/operators/filtering/takeuntil.html

答案 3 :(得分:5)

您可以在observable上使用SwitchMap,它将取消之前请求的任何响应并仅请求最新请求:

https://www.learnrxjs.io/operators/transformation/switchmap.html

答案 4 :(得分:0)

使用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将为任何较晚的订阅者发出最新的值。