2017-08-15 6 views
0

私はRESTリソースを取得するいくつかのコードで約束の使用を改善しようとしています。私はアクションの同じシーケンスを実行させるREST呼び出しの数を持っている:それは以前に このRESTリクエストの約束コードを改善するにはどうすればよいですか?

  • はの開始を示すフラックスアクションをディスパッチ得られていない場合

    1. は、サーバからの設定リソースを取得します要求
    2. 実際のリソース
    3. 応答してJSONを解析するための要求を送るは、解析されたデータとの成功を示すフラックスアクションをディスパッチ。

    私が現在これを行うために使用しているコードは次のとおりです。

    getThingsFromServer() { 
        return getConfigIfNeeded().then(() => { 
         dispatchStartOfRequestAction(); 
         return window.fetch(`${store.baseURL}/resource`) 
            .then((response) => { 
             if(response.ok) { 
              return response.json(); 
             } else { 
              return Promise.reject(new Error(`${response.status} ${response.statusText}`)); 
             } 
            }, (error) => { 
             return Promise.reject(new Error(`Network error: ${error.message}`)); 
            }) 
            .then((data) => { 
             dispatchSuccessAction(data); 
            }, (error) => { 
             return Promise.reject(new Error(`JSON parse error: ${error.message}`)); 
            }) 
            .catch((error) => { 
             dispatchFailureAction(error) 
            }); 
        }); 
    } 
    

    私は(catch()で行われる)障害アクションを派遣したい後、個別に扱うことができるようにしたいと思いますエラー条件がいくつかあります。個々then()エラーハンドラの1つが呼び出される場合は瞬間

    は、後続のすべてのthen()エラーハンドラは、また、最終的にはcatch()を呼び出す前に呼び出されます。私はちょうど1つの個々のハンドラとキャッチを呼び出すことが必要です。

    私は、個々のエラーを個別に処理することなく、最後に単一のキャッチを使用することができますが、さまざまな情報源が、プロミスチェーンの終わりにこれらのさまざまなエラーをすべて処理するプラクティスをサポートしています。個人的な意見を超えてこれに「正しい」答えがありますか?その後、ハンドラから

  • +1

    を使用したいと思う、SO – Quince

    +0

    のトピックをオフに思えるあなたも何かをしたいですか'getConfigIfNeeded'のエラー?それとも決して拒絶しないのだろうか? – Bergi

    答えて

    1

    個々then()エラーハンドラの1つが呼び出される場合は、スロー(または拒否約束を返す)場合、後続のすべてのthen()エラーハンドラはまた、はい

    と呼ばれ、約束の意志拒否され、その後のエラーハンドラが呼び出されます。これを回避する方法は本当にありません。 differentiate the errorsには、have to nestとなります(hereも参照してください)。あなたのケースでは

    、あなたはこの質問がhttps://codereview.stackexchange.comに、より適しているかもしれません

    dispatchStartOfRequestAction(); 
    return fetch(`${store.baseURL}/resource`) 
    .then(response => { 
        if (response.ok) { 
         return response.json() 
         .catch(error => { 
          throw new Error(`JSON parse error: ${error.message}`); 
         }); 
        } else { 
         throw new Error(`${response.status} ${response.statusText}`); 
        } 
    }, error => { 
        throw new Error(`Network error: ${error.message}`); 
    }) 
    .then(dispatchSuccessAction, dispatchFailureAction); 
    
    +0

    あなたがリンクしている約束の「最大2つのレベル」に関する解決策が気に入っていますが、私はそれが明確なコードを得るために最も近いと思います。私は今も突然、専用のエラーハンドラの必要性を認識しています... –

    関連する問題