加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 17:07:40 所属栏目:安全 来源:网络整理
导读:我担心我可能已经失去了递归承诺的兔子洞. 我有一个处理我的api的服务. (它有一个额外的承诺层,所以如果api离线,我可以切换回本地json.(不确定它是否有必要) – mayte我应该为了简单而消除它. 然后我在我的控制器中得到了承诺的异步调用. 只要我得到我期望的
我担心我可能已经失去了递归承诺的兔子洞.

我有一个处理我的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
      });

    };

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读