我正在通过角度巡回英雄应用程序,我在路由中遇到.subscribe方法.有人解释这里发生了什么?
app- http: //embed.plnkr.co/ ? show = preview的链接
在hero-detail.component.ts文件中,
ngOnInit(): void {
this.route.paramMap
.switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id')))
.subscribe(hero => this.hero = hero);
}
Run Code Online (Sandbox Code Playgroud)
Mil*_*lad 102
.subscribe 不是Angular2的事情.
这是一个来自rxjsAngular在内部使用的库的方法.
如果您在订阅时事通讯时和订阅后可以想象自己,每次有新的时事通讯时,他们都会将其发送到您的家(订阅内部的方法被调用).
当您订阅杂志来源(他们Observable在rxjs图书馆中称之为)时会发生这种情况
AJAXAngular中的所有调用都是在场景后面使用这个库,为了使用它们中的任何一个,你必须使用方法名称,例如get,然后调用subscribe,因为get返回和Observable.
此外,当你这样做时,<button (click)="doSomething()">Angular会Observables在场景后面使用并订阅你的东西,在这种情况下是一个click事件.
回到我们的比喻,Observables并且newsletter stores,在你订阅之后,只要有新的杂志,他们就会把它发送给你,除非你去和unsubscribe他们一起去,为此你必须要记住订阅号或ID,其中rxjs包含:
let subscription = magazineStore.getMagazines().subscribe(
(newMagazine)=>{
console.log('newMagazine',newMagazine);
});
Run Code Online (Sandbox Code Playgroud)
当你不想再获得杂志时:
subscription.unsubscribe();
Run Code Online (Sandbox Code Playgroud)
同样,也是如此
this.route.paramMap
Run Code Online (Sandbox Code Playgroud)
这是返回一个Observable,然后你订阅它.
我的个人观点是rxjs为JavaScript世界带来的最伟大的事情之一,它在Angular中更好.
有150个rxjs方法(非常类似于lodash方法)和你正在使用的方法被调用switchMap
在Angular中(当前在Angular-6中).subscribe()是Observable类型的方法。Observable类型是一种实用程序,可以异步或同步地将数据流传输到已订阅了Observable的各种组件或服务。
可观察对象是对Promise链的一种实现/抽象,它将作为ES7的一部分而被提议并受到大力支持。在Angular中,由于rxjs是开发依赖项,因此在内部使用它。
可观察对象本身可以视为来自源的数据流,在Angular中,此源是API端点,服务,数据库或其他可观察对象。但是它的强大之处在于它不期望一个单一的响应。它可以具有一个或多个返回的值。
链接到rxjs以获得可观察/订阅的文档:https ://rxjs-dev.firebaseapp.com/api/index/class/Observable#subscribe-
订阅采用3个方法作为参数,每个函数都是:
在每种方法中,都有可能将其他称为操作符的实用程序传递(或链接)到结果上,以更改形式或执行某些分层逻辑。
在上面的简单示例中:
.subscribe(hero => this.hero = hero);基本上说在这个可观的地方拿出英雄并将其设置为this.hero。
根据文档和我的理解,添加此答案可为Observables提供更多上下文。
订阅是一个代表一次性资源的对象,通常是 Observable 的执行。订阅有一个重要的方法,取消订阅,它不带任何参数,只处理订阅所持有的资源。
import { interval } from 'rxjs';
const observable = interval(1000);
const subscription = observable.subscribe(a=> console.log(a));
/** This cancels the ongoing Observable execution which
was started by calling subscribe with an Observer.*/
subscription.unsubscribe();
Run Code Online (Sandbox Code Playgroud)
订阅本质上只有一个 unsubscribe() 函数来释放资源或取消 Observable 执行。
import { interval } from 'rxjs';
const observable1 = interval(400);
const observable2 = interval(300);
const subscription = observable1.subscribe(x => console.log('first: ' + x));
const childSubscription = observable2.subscribe(x => console.log('second: ' + x));
subscription.add(childSubscription);
setTimeout(() => {
// It unsubscribes BOTH subscription and childSubscription
subscription.unsubscribe();
}, 1000);
Run Code Online (Sandbox Code Playgroud)
根据官方文档,Angular 应该为你取消订阅,但显然,有一个错误。
| 归档时间: |
|
| 查看次数: |
105928 次 |
| 最近记录: |