angularjs – angular然后从服务中捕获成功错误

我担心我可能已经失去了递归承诺的兔子洞.

我有一个处理我的api的服务. (它有一个额外的承诺层,所以如果api离线,我可以切换回本地json.(不确定它是否有必要) – mayte我应该为了简单而消除它.
然后我在我的控制器中得到了承诺的异步调用.

只要我得到我期望的数据,这一切都很有效,但它不能很好地处理错误.当我得到400和500时,它不会通过toastr向用户发送错误消息.

遗憾的是,这不是完全兼容的RESTful api.我得到的400错误很简单

{"Message":"No packages found"}

我真的不知道如何让它按照应有的方式运行,并用then / catch替换成功/错误(根据Angular最佳实践).

这是典型的服务电话:

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

和控制器中的典型调用:

(选项是传回我数据网格的数据对象(Kendo))

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

我该如何清理它?

[更新]尝试按照下面的答案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/Packages?pageSize=20&page=0 400 (Bad Request)

results!

undefined

最佳答案 我正在拆卸开关盒以简化.

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 inturn是一个承诺:

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

    };
点赞