httpコール(Observable)には、@ angular/httpを使用しています。プロミスのストレージメカニズムにはNativeStorageライブラリを使用しています。そのため、私はFromPromiseを使用してPromise関数 "NativeStorage.getItem(" xxx ")をObservableに変換します。Observableでプロミスエラーが発生しないcatch
これは良い練習で、チェーンが "console.log(" HIT SUCCESSFULLY ");"コードの実行を停止します。
ストレージには「externalAccessToken」という項目がないため、Promiseで例外nullをキャッチするのは正常ですが、それ以降は実行が停止する理由はわかりません。
これまで、null以外の何かを返すようにしていて、 "Promise.reject()"を使用して "未処理の約束の拒否"エラーが発生しました。
はどうやって実行するコードを維持し、観察可能
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;
});
});
}
UPDATED QUESTIONのキャッチ機能ヒットすることができます:私はPromise.catchを削除し、例外を未処理キャッチするためにObservable.catchを維持している
を観察可能な;
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;
});
}
次に、次のエラーが表示されます。
「Promise.catch」の代わりに「Observable.catch」を使用しないでください。つまり、エラー処理をfromPromiseから外すのはなぜですか? – jonrsharpe
私はそれを試み、 "処理されていないエラー"のようなものをスローします:item null exception。あなたが望むのであれば、私は正確なエラーを生成して書くことができます – mctuna
はい、[mcve]を余分な詳細なしで教えてください。 – jonrsharpe