我正在编写使用最新版本的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
块而不必单独处理错误?
谢谢你们!
答案 0 :(得分:3)
您不需要使用新的承诺链接所有响应并在一个点捕获错误。通过使用fromPromise
和concatMap
,您可以链接并保持代码的整理(请注意,我使用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);
});
}