【发布时间】:2017-01-04 18:32:57
【问题描述】:
恐怕我已经掉进了递归承诺的兔子洞。
我有一个服务来处理我的 api。 (它有一个额外的承诺层,因此如果 api 脱机,我可以切换回本地 json。(不知道它有多么必要)-为了简单起见,我可能应该消除它)。 然后我在我的控制器中得到了承诺的异步调用。
只要我得到我期望的数据,这一切都很好,但它不能很好地处理错误。当我得到 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);
});
}
});
};
以及控制器中的典型调用:
(options是交回我的数据网格(剑道)的数据对象)
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://
/api/Packages?pageSize=20&page=0 400(错误请求) 结果!
未定义
【问题讨论】:
-
清理什么?你能问一个简单的问题吗?
-
我希望可以。必须有一种正确 的方式来使用服务并进行 $http 调用并返回结果/错误。不是这个。
-
您可以使用
$http加载json。只是说... -
是的,避免deferred antipattern!
-
我希望我能很好地理解 Promise 以识别 模式,更不用说 anti 模式了,更不用说将它分成两个模块了。