可以观察到的链接,并承诺通用误差处理 - 角度



我正在使用Angular Framework的最新版本编写应用程序。我遇到了一个问题 - 我的一些方法返回可观察到的东西,还有一些回报承诺。是否可以为链中的所有请求定义一个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块而不是分开处理错误?

谢谢大家!

您不需要使用新的承诺来链接所有响应并在一个点捕获错误。通过使用fromPromiseconcatMap允许您链条并保持代码组织(请注意,我正在使用可管道的操作员,强烈建议这样做(。

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);
      });
  }

最新更新