2017-06-19 70 views
1

在我的角度应用程序中,我希望能够取消与Rxjs进行的http请求。场景:取消rxjs中的http订阅

isComponentAlive = true; 

onSave() { 
    this.service.save(this.formValue).takeWhile(() => this.isComponentAlive).subscribe(); 
} 

ngOnDestroy() { 
    this.isComponentAlive = false; 
} 

比我有一个取消按钮导航到另一条路线。我想取消挂起的http请求,但这种方式不起作用。我想做更清楚的事情,然后调用取消订阅所有的http请求订阅

+0

'takeWhile'不能用于取消一个挂起的HTTP请求,因为它所需要的谓词被称为[当它收到一个值时](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-takeWhile) - 即当HTTP请求时est发出回应。 – cartant

回答

1

为了取消订阅,您需要保留对其的引用。

onSave() { 
    this.saveSubscription = this.service.save(this.formValue).takeWhile(() => this.isComponentAlive).subscribe(); 
} 

ngOnDestroy() { 
    this.isComponentAlive = false; 
    this.saveSubscription.unsubscribe(); 
} 

,这应该做的伎俩:)

1

一般有两种方法可以做到这一点。

  1. 手动取消

    onSave() { 
        this.sub = this.service.save(this.formValue).subscribe(); 
    } 
    
    ngOnDestroy() { 
        this.sub.unsubscribe(); 
    } 
    

    你还可以创建Subscription类的一个实例,然后只需添加处理它:

    private sub = new Subscription(); 
    
    onSave() { 
        this.sub.add(this.service.save(this.formValue).subscribe()); 
    } 
    
    ngOnDestroy() { 
        this.sub.unsubscribe(); 
    } 
    

    这样你就不需要有多个订阅,并手动拨打unsubscribe()

  2. 使用的Subject一个实例来完成源可观察

    private subject = new Subject(); 
    
    onSave() { 
        this.sub.add(this.service.save(this.formValue).takeUntil(subject).subscribe()); 
    } 
    
    ngOnDestroy() { 
        this.subject.next(); 
    } 
    

顺便说一句,这是一个非常类似的问题给你:RxJS: takeUntil() Angular component's ngOnDestroy()