2017-09-22 105 views
1

大量的角度教程建议使用异步管道自动unsubsribing observable。角度http请求异步管道的好处

什么他们要求:
异步管用于自动退订观测,否则你需要退订手动

他们做了什么:
他们使用的角度http调用REST API作为示例为async管道。

但是,从我的理解,角度HTTP自动取消订阅observable。所以,异步管道实际上并没有达到预期目的,因为即使没有异步管道,observable也会自动取消订阅。

在这个用例中,为什么还需要在这里使用异步管道吗?

样品实施:

getUserList() { 
    return this.http.get(apiUrl); 
} 

this.getUserList().subscribe(user => { 
    this.userList = user; 
}); 

<div *ngFor="let user of userlist | async"> 
    {{ user?.name }} 
    {{ user?.email }} 
</div> 

回答

4

异步管用于自动退订观测,否则你需要 退订手动

他们大概的意思如果你将一个observable赋值给一个类属性Y:

import { interval } from 'rxjs/observable/interval'; 
let original = interval(1000); 

class Comp { 
    o = original; 

再后来与另一个观察的

constructor() { 
    setTimeout(() => { 
     this.o = interval(500); 
    }, 5000); 
} 

认购原来的观察到的更新属性将被设置 - 异步管将有效地调用original.unsubscribe()。这可以看出,在来源:

@Pipe({name: 'async', pure: false}) 
export class AsyncPipe implements OnDestroy, PipeTransform { 
    ... 

    transform(obj: Observable<any>|Promise<any>|null|undefined): any { 
    .... 

    if (obj !== this._obj) { 
     this._dispose(); <------------------------- 
     return this.transform(obj as any); 
    } 

因此,异步管道居然没在这里为 观察的意愿自动退订服务于预期的目的,即使没有异步管道。

有没有其他原因为什么需要在这里使用异步管道 case?

是的,他们用它用于不同的目的 - 把自己保存在你表现出方法所需的一些编码:

getUserList() { 
    return this.http.get(apiUrl); 
} 

// this part can be eliminated if you use ` let user of getUserList() | async` 
this.getUserList().subscribe(user => { 
    this.userList = user; 
}); 

<div *ngFor="let user of userlist"> <---- no need to use `async` here since `userlist` contains values, not observable 
    {{ user?.name }} 
    {{ user?.email }} 
</div> 
1

如果您可以直接在模板中使用的可观察你只需要异步管道。所以异步管道的主要观点是在模板中使用可观察模式,并且自动退订作为额外的好处。

因此,无论

<div *ngFor="let user of userlist"> 
</div> 

<div *ngFor="let user of getUserList() | async"> 
</div>