我正在使用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
块而不是分开处理错误?
谢谢大家!
您不需要使用新的承诺来链接所有响应并在一个点捕获错误。通过使用fromPromise
和concatMap
允许您链条并保持代码组织(请注意,我正在使用可管道的操作员,强烈建议这样做(。
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);
});
}