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); }); }; 结果是:
解决方法
我正在拆卸开关盒以简化.
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 }); }; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |