0

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

次に、次のエラーが表示されます。

enter image description here

+0

「Promise.catch」の代わりに「Observable.catch」を使用しないでください。つまり、エラー処理をfromPromiseから外すのはなぜですか? – jonrsharpe

+0

私はそれを試み、 "処理されていないエラー"のようなものをスローします:item null exception。あなたが望むのであれば、私は正確なエラーを生成して書くことができます – mctuna

+0

はい、[mcve]を余分な詳細なしで教えてください。 – jonrsharpe

答えて

2

Catch作品プログラミングでtry/catch clasuesと同じ:

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

その後、約束の形でのご対応とエラーを処理することができます。あなたがキャッチし、エラーを処理したい場合は

let o = Observable.create((observer)=>{ 
    observer.error(new Error('bang')); 
}).catch(()=>{ 
    // do nothing 
}); 

o.subscribe(()=>{ 
    console.log('I'm still reachable'); 
}); 

が、その後の実行から以下のコードを防ぐ:

try { 
    throw new Error('bang'); 
} catch(ex) { 
    // do nothing 
} 

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'); 
}); 
+0

詳細情報のおかげで; Observableを返す.throw(ex)働いた – mctuna

1

問題は、あなたが引くが、エラーを処理していないということです。 Observableとしてエラーをスローしたいと思うでしょう。正確

this.getExternalAccessTokenFromStorage().subscribe(
    res => console.log(res), 
    error => console.log(error)); 
+0

あなたは ' Observable.throw'それ以外の場合は何も起こりません。 – cgTag

+0

それは右の返信の横にあった、ありがとう – mctuna

関連する問題