2016-08-28 7 views
4

私は再帰的約束のウサギの穴を塞いでしまったのではないかと恐れている。角度はサービスからの成功のエラーをキャッチ

私のAPIを処理するサービスがあります。 (それは、アピがオフラインになったらローカルjsonに戻ることができるように、余分な約束を持っています。 次に、私のコントローラに約束された非同期呼び出しがあります。

これはすべて私がと期待しているデータを取得すると、と長くなりますが、エラーはうまく処理されません。私は400と500を取得するとき、toastr経由でエラーメッセージをユーザーに送信しません。

悲しいことに、これは完全に準拠したRESTful APIではありません。私は戻って取得400エラーは、私は本当にそれが必要として、これが動作するように取得する方法を取得し、(角のベストプラクティスごとなど)を/キャッチで成功/エラーを置き換えるものではありません単に

{"Message":"No packages found"} 

です。

(私のデータグリッド(剣道)に返還データオブジェクトオプションれる)

var _getPackagesPage = function (options) { 

    var pageSize = options.data.pageSize; 
    var page = options.data.page -1; 
    return $q (function(resolve, reject) { 
     switch (dataSource) { 
      case 'api'://staging - live api data 
       return $http({ 
        method: 'get', 
        url: serviceBase + 'api/Packages?pageSize=' + pageSize + '&page=' + page 
       }).then(function(results) { 
        resolve(results); 
       }); 
       break; 

      default: // dev - local json 

       $.getJSON('Content/data/Packages.json', function (json) { 
        var pageSize = options.data.pageSize; 
        var page = options.data.page; 
        var newjson = json.splice(page*pageSize,pageSize); 
        resolve(newjson); 
       }); 
     } 
    }); 
}; 

とコントローラでの一般的なコール:ここ

は、典型的なサービスコールであります
vm.getPackages = function(options) { 
     return packagesService.getPackagesPage (options) 
      .then(function(results) { 
       options.success(results.data.Items); 
      }) 
      .catch(function(error) { 
       options.error(error); 
       toastr.error(error.Message); 
      }); 
    }; 

これをどのようにクリーニングできますか?

[UPDATE]以下回答1当たりしようと修正、

サービス:

var _getOrdersPage = function (options) { 

     var deff = $q.defer(); 
     var pageSize = options.data.pageSize; 
     var page = options.data.page -1; 
     return $http({ 
      method: 'get', 
      url: serviceBase + 'api/Packages?pageSize=' + pageSize + '&page=' + page 
     }) 
     .then(
      function(results) { 
       deff.resolve(results); 
      }, 
      function(ex){ 
       deff.reject(ex); 
      }); 
     return deff.promise; 
    }; 

コントローラ:で

vm.getOrders = function (options) { 
     return ordersService.getOrdersPage (options) 
      .then(function(results) { 
       console.log("results!"); 
       console.log(results); 
      }) 
      .catch(function(error) { 
       console.log("error!"); 
       console.log(error); 
      }); 
    }; 

結果:

GET HTTP: // < myURL>/api /パッケージ?pageSize = 20 &ページ= 0 400(不正リクエスト)

結果!

未定義

+0

クリーンアップ何?あなたは、単一の、簡単な質問をすることができますか? – Amit

+0

できたらいいなあ。サービスを使い、$ httpを呼び出して結果/エラーを返す*正しい方法が必要です。これはそうではありません。 – DaveC426913

+0

'$ http'でjsonsを読み込むことができます。ちょうど言っている... –

答えて

1

私は簡潔にするためにスイッチケースを取り外しています。

var _getPackagesPage = function (options) { 

    var pageSize = options.data.pageSize; 
    var page = options.data.page -1; 

    return $http({ 
     method: 'get', 
     url: serviceBase + 'api/Packages?pageSize=' + pageSize + '&page=' + page 
     }); 

    }; 
+0

これは400であっても、コントローラに成功を返すようです。したがって、options.success(results.data.Items)はdata = undefinedを返します。 – DaveC426913

+0

サービスが400を返すと、約束を拒否する場所から.thenメソッドを呼び出すエラーが発生します。これはあなたの成功のコールバックコントローラに戻ってこないでしょう、これはエラーcallbacjを代わりに打つでしょう。 – Developer

+0

しかし、それは何が起こるかではありません。私は試みられた修正とその結果をオープニングポストに加えました。 – DaveC426913

0

あなたが持っている:

var _getPackagesPage = function (options) { 

var pageSize = options.data.pageSize; 
var page = options.data.page -1; 
var deff = $q.defer(); 

$http({ 
     method: 'get', 
     url: serviceBase + 'api/Packages?pageSize=' + pageSize + '&page=' + page 
     }).then(
      function(results) { 
       deff.resolve(results); 
      }, 
      function(ex){ 
       deff.reject(ex); 
      }); 

return deff.promise; 
    }; 

コントローラ

vm.getOrders = function (options) { 
    return ordersService.getOrdersPage (options) 
     .then(
     function(results) { 
      console.log("results!"); 
      console.log(results); 
     }, 
     function(error) { 
      console.log("error!"); 
      console.log(error); 
     }); 
}; 

は、あなたがあなたのサービス内の任意のロジックを持っていけない場合、あなたは$ HTTPとして$ HTTP自体を返すことができますこれにより、次に約束ですあなたのサービスのリターンが多すぎます。 2番目は呼び出されません。

$ httpが妥協を返すので、約束を手動で作成する必要はありません。

あなたのサービスからのデータは返されません。

var _getOrdersPage = function(options) { 
     var pageSize = options.data.pageSize; 
     var page = options.data.page -1; 
     return $http({ 
      method: 'get', 
      url: serviceBase + 'api/Packages?pageSize=' + pageSize + '&page=' + page 
     }) 
     .then(
      function(results) { 
       return results; 
      }, 
      function(ex){ 
       return ex; 
      }); 
} 

コントローラーは問題ありません。あなたのコントローラーは問題ありません。キャッチを使用するか、エラーコールバックを渡すことができます。

例:

function myService($http) { 
 
    this.getData = function(url) { 
 
    return $http.get(url). 
 
    then(function(response) { 
 
     return response.data; 
 
    }, function(error) { 
 
     return error; 
 
    }); 
 
    } 
 
}; 
 

 
function MyController(myService) { 
 
    var vm = this; 
 
    vm.result = []; 
 
    vm.apiUrl = "https://randomuser.me/api/"; 
 
    myService.getData(vm.apiUrl).then(function (data) { 
 
    vm.result = data; 
 
    }, 
 
    function(error) { 
 
    console.log(error); 
 
    }); 
 
}; 
 

 
angular.module('myApp', []); 
 
angular 
 
    .module('myApp') 
 
    .service('myService', myService) 
 
    .controller('MyController', MyController);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script> 
 
<div ng-app="myApp"> 
 
    <div ng-controller="MyController as ctrl"> 
 
    {{ ctrl.result }} 
 
    </div> 
 
</div>

関連する問題