订阅Angular2中的Observable

时间:2017-12-05 21:36:42

标签: javascript angular typescript

我有一个功能,可以记住以前的网址

   prevId () {
     let name, id, lat, lng;
    this.router.events
      .filter(event => event instanceof NavigationEnd)
      .subscribe(e => {
        console.log('prev:', this.previousUrl);
        this.previousUrl = (e as NavigationEnd).url;
    }

如果可能的话,我想用Observable风格重写它,但我尝试的一切都不起作用。 有可能解决吗? 你能不能给我一些关于Observable的好文章,因为我只是初学者,主题似乎很难。

UPD:我需要稍后在函数外部使用数据,这就是我需要Observer的原因。

例如

myFun(a) {
console.log(a);
}

myFun(this.previousUrl);

1 个答案:

答案 0 :(得分:0)

如果你唯一需要的是使用你的函数之外的url,你可以这样做:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/take';

prevId(): Observable<NavigationEnd> {
  return new Observable(observer => {
    this.router.events
      .filter(event => event instanceof NavigationEnd)
      .take(1)
      .subscribe(e => {
        observer.next(e as NavigationEnd);
        observer.complete();
      });
  });
}

然后你必须像这样调用函数:

prevId().subscribe(navigationEndEvent => {
  this.previousUrl = navigationEndEvent.url;
});

我让这个例子认为您在调用prevId()时只需要previousUrl信息,因此我将.take(1)运算符设为observer.complete()。 当第一个值来自.take(1)时,this.router.event会自动取消订阅observer.complete()订阅。 并且{{1}}还将取消订阅返回的Observable中所做的所有订阅。