2017-02-21 12 views
1

私は、これまでのプロジェクトでこのすべてを何年にもわたって考えていたと思います。角度の約束と連鎖:ビジネスデータのエラーがあるとチェーンを破る方法

ゴール:他のサービスを呼び出すサービスを受け取り、エラーが返された場合(のステータスが200でない場合)、非同期のものが待機しており、処理を続行していないことが必要です。

私はそれほど単純ではないほど素晴らしい例を見たことがないように思えます。

私は returnとの問題を抱えていますようだ..私は角度が(1)フードの下で何をしているかについての様々な記事を読んで、私は.successなど、.then、$ Qがあることがわかり他のネストされたバンドルされたサービスコールは、問題をチェックすることなく行われます。ヌル(それが悪いです) errorListアレイ 1 0「この順序は、提出することができません...」(悪く) hasErrors:

は、基本的にこのイメージは

データ戻って来ているかを示して(真として悪いですウェル)

は、だからデータがキャプチャし、ユーザーに表示して、より多くの処理の上に移動しないことが私にとって重要である

enter image description here

これは、その後、私は確かにSparkRequestService.submitRequest(request) を呼び出すことが、添付された画像に基づいてよ、私はそうresData

でエラーを取得しています、私が必要と思われる操作の私の注文

this.submitEnrollment = function (enrollment) { 
    return getSubmit(requestData); 
} 

// Which CALLS below 

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(
      function (resData) { 
       console.log("resData", resData); 
       enrollmentService.resetEnrollment(); 
       return resData; 
      }, 
      function (resData) { 
       console.log('error'); 
      } 
     ); 
} 

ですresDataの質問にはどうしたらいいですか?だから、私は本当にこの他のサービスを呼び出すことを許可しないでくださいenrollmentService.resetEnrollment();

私はどのように私はリファクタリングを処理することから停止することはできますか? if文で.then

答えて

1

拒否約束を変換から拒否ハンドラを防止するために達成された約束には、拒否ハンドラのthrow文を使用することが重要です。

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(
      function (resData) { 
       console.log("resData", resData); 
       enrollmentService.resetEnrollment(); 
       return resData; 
      }, 
      function (errorResponse) { 
       console.log('error'); 
       //IMPORTANT 
       //throw to chain rejection 
       throw errorResponse; 
      } 
     ); 
} 

関数がreturnまたはthrowステートメントを省略すると、この関数はundefinedの値を返します。これはを約束した約束を拒否してundefinedの値に変換します。


問題throwステートメントを使用し、それはリターンオブジェクト

に変換に拒否約束の履行の約束を包んビジネス誤りである...ということです。

this.submitEnrollment = function (enrollment) { 
    var promise = getSubmit(requestData); 
    var newPromise = promise.then(function(response) { 
     if (response.data.hasErrors) { 
      console.log(response.data.errorList); 
      response.data.errorList.push("submitEnrollent: Rejected"); 
      //THROW to create rejection 
      throw response; 
     } else { 
      //RETURN response to chain success 
      return response; 
     } 
    }); 
    return newPromise; 
} 

約束は拒否にを変換すると、チェーン内のすべての後続の成功ハンドラがスキップされます。拒否ハンドラが見つかるまで連鎖が追跡されます。

+0

問題は 'enrollmentService.resetEnrollment();が呼び出されることです技術的には戻り値オブジェクトにラップされたビジネスエラーですので、 'function(errorResponse)'がどのようにヒットするのかわかりません。 –

+0

Sweet、ありがとうございます! –

+0

私を混乱させる質問の一部は、事実、特定の条件の下でステータス200(OK)HTTP応答を拒否しようとしていたときに「** 200のステータスではない」と言われています。 – georgeawg

0

あなたがresData内のエラーを取得するときSparkRequestService.submitRequest(request)によって返された約束はを拒否されていないようです。このため、successCallbackthenが呼び出され、2番目のerrorCallbackが呼び出されません。

このため、successCallbackの内側にあなたがたとえば、エラーをチェックし、それに応じて動作するようにresDataのデータを検査する必要があります。

var getSubmit = function (request) { 
    return SparkRequestService 
     .submitRequest(request) 
     .then(function (resData) { 
       console.log("resData", resData); 
       if(resData === null) { // Check for errors 
        // There is an error, manage it inside this block of code 
        // ... 
        // You can also create a rejected promise with $q.reject() and passing resData containing the errors 
        return $q.reject(resData); 
       } else { 
        // Call resetEnrollment() in the ELSE branch so, it is executed only if resData does not contain errors 
        enrollmentService.resetEnrollment(); 
        return resData; 
       } 
      }, 
      function (resData) { 
       console.log('error'); 
      } 
     ); 
}; 
+0

アドバイスありがとうresDataはnullではありませんが、正しい方向に多くの手助けをしてくれたので+1します - thx –

関連する問題