[英]Promise Error in Observable not calling catch
我使用@ angular / http進行http調用(可觀察),並使用NativeStorage庫進行Promise存儲機制。 這就是為什么我使用FromPromise將Promise功能“ NativeStorage.getItem(” xxx“)”轉換為Observable的原因。
我什至不確定這是否是一個好習慣,並且在“ console.log(“ HIT SUCCESSFULLY”);“行中斷了鏈。 並停止執行代碼。
由於存儲中沒有名為“ externalAccessToken”的項目,因此在Promise中捕獲異常null是正常的,但是我不明白為什么它在此之后停止執行。
到現在為止,我嘗試返回除null之外的其他內容,並使用“ Promise.reject()”返回了導致“未處理的承諾拒絕”錯誤。
我如何保持代碼執行並點擊Observable的catch函數
public getExternalAccessTokenFromStorage(): Observable<any> {
let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise.then(x => x)
.catch(() => {
console.log("HIT SUCCESSFULLY");
return null
}));
return getExternalAccessTokenFromStorage.map(x => {
console.log("NOT HIT AT ALL");
return x;
}).catch(() => {
console.log("NOT HIT AT ALL");
return null;
});
}
public getUserInfo(): Observable<StoredUserModel> {
//Get External Access Token From LocalStorage
return this.getExternalAccessTokenFromStorage().flatMap((x: IExternalAccessTokenBindingModel) => {
return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
console.log("NOT HIT AT ALL");
let headers = new Headers();
headers.append("Authorization", "Bearer " + accessToken.access_token);
headers.append("Content-Type", "application/json");
let options = new RequestOptions({ headers: headers });
var externalBindingModel = JSON.stringify(x);
return this.http.post(this.baseUrl + '/api/Account/ExternalUserInfo', externalBindingModel, options).map((res: Response) => {
//ADD USER INTO NATIVESTORAGE
this.addUserIntoStorage(res.json());
return res.json();
});
});
}).catch(x => {
return this.getAccessTokenFromStorage().flatMap((accessToken: AccessTokenModel) => {
console.log("NOT HIT AT ALL");
let headers = new Headers();
headers.append("Authorization", "Bearer " + accessToken.access_token);
let options = new RequestOptions({ headers: headers });
return this.http.get(this.baseUrl + '/api/Account/UserInfo', options).map((res: Response) => {
//ADD USER INTO NATIVESTORAGE
let user: StoredUserModel = res.json();
this.addUserIntoStorage(res.json());
return user;
});
}).catch(error => {
return null;
});
});
}
更新的問題:
我已刪除Promise.catch並保留Observable.catch以便在Observable中捕獲未處理的異常;
public getExternalAccessTokenFromStorage(): Observable<any> {
let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise);
return getExternalAccessTokenFromStorage.map(x => {
return x;
}).catch(() => {
return null;
});
}
我得到以下錯誤;
Catch
工作原理與編程中的try / catch
完全相同。
給出以下示例:
try {
throw new Error('bang');
} catch(ex) {
// do nothing
}
console.log('I'm still reachable');
我們可以像這樣通過觀察來重現上面的內容:
let o = Observable.create((observer)=>{
observer.error(new Error('bang'));
}).catch(()=>{
// do nothing
});
o.subscribe(()=>{
console.log('I'm still reachable');
});
如果您想捕獲並處理錯誤,但是又想阻止下面的代碼使用try / catch
執行,您可以這樣做:
try {
throw new Error('bang');
} catch(ex) {
// do some logic here
throw ex;
}
console.log('I cannot be reached');
可觀察的是相同的。 您必須重新拋出該錯誤或產生一個也會失敗的可觀察對象。
let o = Observable.create((observer)=>{
observer.error(new Error('bang'));
}).catch((ex)=>{
// do some logic here
return Observable.throw(ex);
});
o.subscribe(()=>{
console.log('I cannot be reached');
});
問題是您正在捕獲但未處理錯誤。 您將需要將該錯誤作為Observable拋出。
public getExternalAccessTokenFromStorage(): Observable<any> {
let externalAccessTokenPromise = NativeStorage.getItem('externalAccessToken');
let getExternalAccessTokenFromStorage: Observable<any> = Observable.fromPromise(externalAccessTokenPromise);
return getExternalAccessTokenFromStorage.map(x => {
return x;
}).catch((error: any) =>
Observable.throw(error.json().error || 'Server error');
);
}
然后,您可以以承諾的形式處理您的響應和錯誤:
this.getExternalAccessTokenFromStorage().subscribe(
res => console.log(res),
error => console.log(error));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.