angular2 - 在observable完成后导航

JMa*_*Mac 15 observable angular

我有这样的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;
        });
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个observable,并创建了一个subscription(response),它是返回的成功值.

现在,在我的组件中,我想打电话UserService.logout(),然后导航到一个新的路线:

logout() {
    this.userService.logout();
    this.router.navigate(['LandingPage']);
  }
Run Code Online (Sandbox Code Playgroud)

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

使用promises,我可以做这样的事情:

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

我怎么能用observable做同样的事情?在我的UserService课堂上,我想创建一个observable,订阅它,在成功或出错时做一些事情,然后从我的视图组件导航.

dfs*_*fsq 16

你实际上可以让logout方法返回一个promise并正常使用它.它不一定是可观察的:

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']))
}
Run Code Online (Sandbox Code Playgroud)


cod*_*ely 8

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

import 'rxjs/operators/finally';
Run Code Online (Sandbox Code Playgroud)

你的logout()将是:

 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 ----

    });
  }
Run Code Online (Sandbox Code Playgroud)

如果你真的想要使用诺言:

import 'rxjs/add/operator/toPromise';

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

在component.ts中

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

  • `finally()`效果很好,但你必须正确导入它:`import'rxjs/add/operator/finally';` (2认同)