angular2 - 在observable完成后导航

时间:2016-02-11 22:13:47

标签: angular observable

在我的http

中,我有一个UserService观察者
logout() {
    return this.http.delete(this.baseUrl + url, {
          headers: this.headers()
        }).map((res: IResponse) => {
          var json = res.json();
          json.headers = res.headers;
          return json;
        }).subscribe((response) => {
          //DO SOMETHING, THEN ----
          return res;
        });
}

我创建了一个observable,并创建了一个订阅(response),这是返回的成功值。

现在,在我的组件中,我想调用UserService.logout(),然后导航到新路线:

logout() {
    this.userService.logout();
    this.router.navigate(['LandingPage']);
  }

显然,这可能是异步发生的,我可能会在退出之前导航。

使用promises,我可以这样做:

this.userService.logout().then(() => { this.router.navigate(['LandingPage']); });

我如何用observable做同样的事情?在我的UserService课程中,我想创建一个observable,订阅它,在成功或出错时做一些事情,然后从我的视图组件导航。

4 个答案:

答案 0 :(得分:16)

您实际上可以使logout方法返回一个承诺并正常使用它。它不一定是Observable:

logout() {
    return new Promise((resolve, reject) => {
        this.http.delete(this.baseUrl + url, { headers: this.headers() })
            .map((res: IResponse) => {
              var json = res.json();
              json.headers = res.headers;
              return json;
            })
            .subscribe(data => {
              //DO SOMETHING, THEN ----
              resolve(data);
            }, error => reject(error));
    });
}

logout() {
  this.userService.logout().then(response => this.router.navigate(['LandingPage']))
}

答案 1 :(得分:7)

Observable对象最后有方法,试试吧。 不要忘记先导入:

import 'rxjs/operators/finally';

您的退出()将是:

 logout() {
  return this.http.delete(this.baseUrl + url, { headers: this.headers() })
    .map(res => res.json())
    .finally(() => this.router.navigate(['LandingPage']))
    .subscribe((response) => {
      //DO SOMETHING, THEN ----

    });
  }

如果你真的想使用诺言:

import 'rxjs/add/operator/toPromise';

logout() {
  return this.http.delete(this.baseUrl + url, { headers: this.headers() })
    .map(res => res.json());

在component.ts

var aPromise = this.userService.logout().toPromise();
aPromise.then(() => {
    this.router.navigate(['LandingPage']);
});

答案 2 :(得分:0)

您不能等待Observable完成,因为它的流可能会无限期地继续。但您可以在router.navigate方法中调用subscribe

logout() {
  return this.http.delete(this.baseUrl + url, { headers: this.headers() })
    .map((res: IResponse) => res.json())
    .subscribe((response) => {
      //DO SOMETHING, THEN ----
      this.router.navigate(['LandingPage']);
    });
  }

如果这还不够,subscribe会返回Subscription方法unsubscribe停止等待Observable数据的unsubscribe。因此,如果必须,您可以等待超时时间并致电jQuery('#message').parent().show();

答案 3 :(得分:0)

注销需要返回Observable而不是订阅。 例如:

    logout(): Observable<T> {
        return this.http.delete(this.baseUrl + url, {
              headers: this.headers()
            }).map((res: IResponse) => {
              var json = res.json();
              json.headers = res.headers;
              return json;
            })
            .catch((err)=>Observable.empty()) // return empty if error
            .share(); // to ensure that no duplicate http calls can occur
 
    }

    //in component:

    this.service.logout()
      .do(()=>this.router.navigate(['LandingPage']);)//do stuff
      .subscribe((res:any)=>{});

    //or with template async pipe:

    public result$ = Observable<T>;

    result$ = this.service.logout()
      .do(()=>//do stuff);

    //in template:
 
    {{(result$ | async)?.id}}
    or simply
    {{result$ | async}}

    // P.s. do not forget about unsubscribe(), thats why I prefer to use async (since that's the Async pipe's job.)

有关运算符/方法的更多信息:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/observable.md