链接Observable with Promises用于常见错误处理 - Angular

时间:2018-04-05 21:05:57

标签: angular promise observable chaining

我正在编写使用最新版本的Angular框架编写应用程序。我遇到了一个问题 - 我的一些方法返回了observable,有些返回了promise。 是否可以链接它们以便为链中的所有请求定义单个catch块? (我的意思是你通常用承诺做的方式)。

看看这段代码示例:

loginToBackendServer(token: string) {
return new Promise ((resolve, reject) => {
  this.userService.loginUserWithFb().subscribe(backendUser => {
    this.facebookProvider.getBasicUserData().then(profile => {
      let userData = {
        id: backendUser['id'],
        facebookId: profile['id'],
        picture: profile['picture_large']['data']['url'],
        name: profile['name']
      };
      this.userService.userData = userData;
      this.sharedService.emitUserData(userData);
      this.storage.set("fbAccessToken", token);
      resolve();
    })
      .catch(error => {
        console.log(error);
        reject();
      })
  }, error => {
    console.log(error);
    reject();
  });
});

}

如何链接.subscribe().then()以便我只有一个catch块而不必单独处理错误?

谢谢你们!

1 个答案:

答案 0 :(得分:3)

您不需要使用新的承诺链接所有响应并在一个点捕获错误。通过使用fromPromiseconcatMap,您可以链接并保持代码的整理(请注意,我使用the pipeable operators,强烈建议您这样做。)

import { fromPromise } from 'rxjs/observable/fromPromise';
import { concatMap } from 'rxjs/operators';

...

loginToBackendServer(token: string) {
      this.userService.loginUserWithFb().pipe(
          concatMap(backendUser => fromPromise(this.facebookProvider.getBasicUserData()))
      ).subscribe(profile => {
          let userData = {
              id: backendUser['id'],
              facebookId: profile['id'],
              picture: profile['picture_large']['data']['url'],
              name: profile['name']
          };

          this.userService.userData = userData;
          this.sharedService.emitUserData(userData);
          this.storage.set("fbAccessToken", token);
      }, error => {
          console.log(error);
      });
  }