我担心我可能已经失去了递归承诺的兔子洞.
我有一个处理我的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 }); };