2017-03-17 21 views
1

私はバックエンドからデータを取り出すTypeScriptで次のサービスを持っています。正しいプロミスが成功とエラーのコールバックを処理する

関数getAllPropertiesByAppIdのパラメータとして、私は成功とエラーのコールバックを持っています。

export class PropertyService implements IPropertyService { 

/** 
* Get all properties 
*/ 
public getAllPropertiesByAppId(appliactionId: string, success: (properties: Array<IPropertyItem>) => void, error: (error: any) => void): void {    

    //set up createRequestStr and requestInit 

    fetch(createRequestStr, requestInit) 
     .then<IPropertyItem[]>((response: Response) => { 
      if (response.status===401) { 
       throw new UnAuthorizedException(); 
      } 
      return response.json<IPropertyItem[]>(); 
     }) 
     .then((response: IPropertyItem[]) => {    
      success(response); 
     }) 
     .catch((reason: any) => { 
      //error handling 
      } 
     }); 
} 

その後、私は自分の行動の作成者にこのサービスを使用しています:

initProperties: (appId: string): ActionCreator => (dispatch: Redux.Dispatch, getState:() => IApplicationState) => { 
    "use strict"; 

    console.log("ShoppingCart initProperties - Request all Property"); 

    var service: IPropertyService = kernel.get<IPropertyService>("IPropertyService"); 

    service.getAllPropertiesByAppId(appId, (properties: Array<IPropertyItem>): void => { 

     dispatch(new ShoppingCartPropertiesLoaded(appId, properties)); 
     dispatch(new ShoppingCartPropertiesDone(appId, System.Init.Done));    

    }, (error: any): void => { 
     console.log("ShoppingCart initProperties - error:" + error); 
     dispatch(new ShoppingCartPropertiesDone(appId, System.Init.Error)); 
    }); 
} 

をだから私はinitPropertiesアクションの作成者を呼び出すときには、getAllPropertiesByAppIdを呼び出し、すべてがうまくているとき、私はShoppingCartPropertiesLoadedアクションとShoppingCartPropertiesDoneを派遣します。

私は保存するために接続されている単純なコンポーネントを持っており、renderメソッドは

export default class TotalPriceList extends React.Component<ITotalPriceListProps, void> { 

public render(): JSX.Element { 

    throw 'SomeError'; 
} 
} 

未処理の例外は、フェッチのcatch文で終わるを実行しているときに、コンポーネントがエラーをスローします。

私は正常に終了する方法を忘れてしまったのですが、catch/catchステートメントでコールバックからcatch例外を避けるために、ステートメント以外の関数/コールバックを呼び出す方法を教えてください。

あなたの助けのおかげで非常に多くの

答えて

2

関数getAllPropertiesByAppIdのパラメータとして、成功とエラーのコールバックがあります。

これは実際の問題です。 は常に非同期関数から約束を返すべきです。 コールバックパラメータの使用を停止してください。

あなたのコードでは、偶然に未処理の拒絶であなたの問題を解決します

/** 
* Get all properties 
*/ 
public getAllPropertiesByAppId(appliactionId: string): Promise<IPropertyItem[]> { 
    //set up createRequestStr and requestInit 
    return fetch(createRequestStr, requestInit) 
// ^^^^^^ 
    .then<IPropertyItem[]>((response: Response) => { 
     if (response.status===401) { 
      throw new UnAuthorizedException(); 
     } 
     return response.json<IPropertyItem[]>(); 
    }); 
} 

これをお読みください。チェーンを終了せずに約束を返すことで、いつものようにエラーを処理する責任を発信者にかけることになります。また、呼び出し元は暗黙のうちに約束のコールバックで何かを行う責任があります。約束返すメソッドにはまったく関係ありません。

そのため、私が探していたまさにです

service.getAllPropertiesByAppId(appId).then((properties: Array<IPropertyItem>): void => { 
//         ^^^^^ 
    dispatch(new ShoppingCartPropertiesLoaded(appId, properties)); 
    dispatch(new ShoppingCartPropertiesDone(appId, System.Init.Done));    
}, (error: any): void => { 
    console.log("ShoppingCart initProperties - error:" + error); 
    dispatch(new ShoppingCartPropertiesDone(appId, System.Init.Error)); 
}).catch((reason: any) => { 
    // error handling for a failed dispatch 
}); 
+0

完璧を使用すると思います!ありがとうBergi! –

0

あなたが約束チェーン内の例外をキャッチしたくない場合は、末尾にしか.catchコールを削除する必要があります。

ただし、try {} catch (error) {}ブロックでこのエラーをキャッチすることはできません。代わりに、最高レベルでunhandledRejectionを受け取るポイントまでバブルします。

私が正しく理解していれば、コールバック(success)をgetAllPropertiesByAppIdに渡します。これはコールバックを呼び出す約束を返します。基本的にfetch(…).then(success)です。ですから、あなたが経験することは、約束事に囲まれた関数内の例外の定義された振舞いに完全になります。

連続通行スタイル(コールバック)と約束を混合するのではなく、約束をすべて使用することに変わります。等

何か(擬似コードJSで、申し訳ありませんtsはない)ディスパッチコンポーネントの内部例外をスロー

class Service { 
    getAllPropertiesByAppId (appId) { 
    return fetch(createRequestStr, requestInit) 
      .then(response => response.json()); 
    } 
}; 

// … 

service.getAllPropertiesByAppId(…) 
.then(dispatchAllTheThings) 
.catch(error => { console.log(…); dispatch(…) }) 

は次にdispatchAllTheThingsを呼び出した後約束鎖に.catch内部に捕捉されます。

関連する問題