我应该何时存储Subscription实例并unsubscribe()在NgOnDestroy生命周期中调用,何时可以忽略它们?
保存所有订阅会在组件代码中引入很多混乱.
HTTP客户端指南忽略这样的订阅:
getHeroes() {
this.heroService.getHeroes()
.subscribe(
heroes => this.heroes = heroes,
error => this.errorMessage = <any>error);
}
Run Code Online (Sandbox Code Playgroud)
同时," 航线与导航指南"说:
最终,我们会在其他地方导航.路由器将从DOM中删除此组件并将其销毁.在此之前我们需要自己清理.具体来说,我们必须在Angular破坏组件之前取消订阅.如果不这样做可能会造成内存泄漏.
我们取消订阅我们
Observable的ngOnDestroy方法.
private sub: any;
ngOnInit() {
this.sub = this.route.params.subscribe(params => {
let id = +params['id']; // (+) converts string 'id' to a number
this.service.getHero(id).then(hero => this.hero = hero);
});
}
ngOnDestroy() {
this.sub.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud) subscription observable rxjs angular angular-component-life-cycle
我希望能够等待一个可观察的,例如
const source = Rx.Observable.create(/* ... */)
//...
await source;
Run Code Online (Sandbox Code Playgroud)
天真的尝试会导致等待立即解决而不会阻止执行
编辑:我的完整用途的伪代码是:
if (condition) {
await observable;
}
// a bunch of other code
Run Code Online (Sandbox Code Playgroud)
我知道我可以将其他代码移动到另一个单独的函数并将其传递给subscribe回调,但我希望能够避免这种情况.
我在Angular上观看了一些课程,发现有不同的方法来管理来自Http请求的数据.
.map(),.subscribe().toPromise(),.then(),.catch()我toPromise()在我的应用程序中使用过,因为我发现它类似于AngularJS Http服务.
在什么情况下我需要使用Observables?
我目前正在评估替换Angular的优点的利弊。RxJS” Observable与普通的Promise,这样我可以使用async和await并获得更直观的代码风格。
我们的典型场景之一:在中加载一些数据ngOnInit。使用Observables,我们可以:
ngOnInit () {
this.service.getData().subscribe(data => {
this.data = this.modifyMyData(data);
});
}
Run Code Online (Sandbox Code Playgroud)
当我改为返回Promisefrom getData(),并使用async和时await,它变为:
async ngOnInit () {
const data = await this.service.getData();
this.data = this.modifyMyData(data);
}
Run Code Online (Sandbox Code Playgroud)
现在,很明显,Angular不会“知道”,而ngOnInit变成了async。我觉得这不是问题:我的应用仍然可以像以前一样工作。但是,当我查看OnInit接口时,显然并未以暗示可以声明该函数的方式声明该函数async:
ngOnInit(): void;
Run Code Online (Sandbox Code Playgroud)
所以-底线:我在这里做什么合理吗?还是会遇到任何无法预料的问题?
从本质上讲,标题所说的是,为了进行http调用,是否有任何理由使用可观察量而不是承诺?看起来像不必要的过度复杂,因为所有的调用都会成功或失败,并且几乎没有真正的理由取消它.要求这是典型的用例,而不是典型的可观察性销售 - 去抖动(具有讽刺意味的是,无论如何,ng-debounce确实很好,而不会进行无用的调用).
在任何情况下,Promise都比可观察的功能更强大吗?我知道可观察变量比承诺具有很多好处。但是无论如何,我应该只对可观察对象使用诺言。
我发现了这个链接,promise vs observables。但是,这始终向我展示了可观察性优于承诺的优势。我想知道诺言比可观察的好处。
从这里:https ://stackoverflow.com/a/40135509/462608
首先,这个答案描述了 Observables 如何有助于防止向服务器发出相同的重复请求,以及我们如何在多个请求之间暂停,以便服务器不会过载。
他们说:
就我在 Angular 中使用 Http 而言,我同意在正常用例中使用 Observable 与 Promise 没有太大区别。这些优点在实践中都没有真正相关。希望我将来能看到一些高级用例:)
我在这里理解的是,当使用 Http 时,Observables 的好处并不真正相关。
为什么会这样?Http在这种情况下扮演什么角色呢?
我必须研究什么主题才能理解 Http 在这里的作用?
我正在寻找关于RXJS中Observable的简单英语解释.
它可以用于什么,以及任何有用的解释视频链接,教程,用例,示例,或任何真正的.
到目前为止,我在Udemy,Todd Motto,Youtube,Angular官方网站上找到的任何内容都没有找到我,我只是想要一个基本的解释,如果可能的话.
到目前为止,我所知道的是你可以用观察者订阅它们.它只是另一种变量吗?
提前致谢.
我正在使用 ionic/angular 和 RXJS observables。
我正在尝试使用 Rxjs observables 重构我的代码,我有下一个代码:
ionViewWillEnter() {
if (this.platform.is('core') || this.platform.is('mobileweb')) {
this.lat = 37.3675506;
this.lng = -6.0452695;
this.printMap();
} else {
if (this.platform.is('android')) {
this.tryGeolocation();
} else if (this.platform.is('ios')) {
console.log("IOS")
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户从 android 移动设备访问我应该检查:isLocationAuthorized、isLocationEnabled() 以使用 getCurrentPosition() 获取当前位置,然后我必须在使用 Observables forkjoin 的地方打印 Map。
问题是检查方法返回承诺,我不知道如何链接这个流程。
tryGeolocation 是下一个:
async tryGeolocation() {
try {
if (await this.diagnostic.isLocationAuthorized()) {
if (await this.diagnostic.isLocationEnabled()) {
this.loading = this.loadingCtrl.create({
content: 'Localizando...',
dismissOnPageChange: true
});
this.loading.present();
const {coords} = await this.geolocation.getCurrentPosition();
this.lat …Run Code Online (Sandbox Code Playgroud) 我有一个 Angular 5 站点,它从 REST API 接收数据,例如每个页面向 API 发出 1-4 个请求,发生的情况是请求有时需要很长时间(有时不需要)。
现在,所有请求都使用Observable在一个函数中执行:
return this.http.post(url, {headers: this.header})
.map(res => res.json())
.catch(this.handleError)
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 是否因为正在使用 Observable 而导致缓慢的过程发生?会承诺将是更好的性能?或者在性能上下文中 Observable 和 Promise 之间没有区别吗?
angular ×9
observable ×7
rxjs ×6
promise ×3
http ×2
angular-component-life-cycle ×1
angularjs ×1
asynchronous ×1
ecmascript-6 ×1
ecmascript-7 ×1
javascript ×1
rxjs5 ×1
subscription ×1
typescript ×1