我还是Angular的新手并承诺所以我希望我在这里有正确的想法。
我目前有一个数据层服务,它使用restangular来获取一些数据,然后返回一个promise,就像这样......
dataStore.getUsers = function (params) {
return users.getList(params);
};
然后,我调用此函数的控制器会收到一个承诺,就像这样......
$dataStore.getUsers(params).then(function (response) {
$scope.users = response;
}, function(response) {
$log.error("Get users returned an error: ", response);
});
这很好用,但我想在传回数据存储之前使用我的数据存储区内的promise。我想使用.then()方法检查它是否失败并进行一些记录,然后,从成功函数和失败函数我想将原始承诺返回给我的控制器
我的控制器可以像现在一样使用.then()方法,事实上,我根本不想让我的控制器代码发生变化,只是我的数据存储区代码。
这里有一些半伪代码来展示我喜欢的数据存储功能...
dataStore.getUsers = function (params) {
users.getList(params).then(function (response) {
$log("server responded")
return original promise;
}, function(response) {
$log.error("server did not respond");
return original promise;
});
};
答案 0 :(得分:8)
你的伪代码实际上并不遥远。承诺链:
dataStore.getUsers = function (params) {
return users.getList(params).then(function (response) {
$log("server responded")
return response;
}, function(failure) {
$log.error("server did not respond");
// change to throw if you want Angular lever logs
return $q.reject(failure);
});
};
控制器现在以相同的值被解析/拒绝。日志需要访问promise,因此必须添加.then
处理程序才能处理它。其他承诺库对此有着可靠的方法,但在这方面,$ q是极简主义的。
或者,您可以使用更好的catch语法,并将错误传播到日志中:
dataStore.getUsers = function (params) {
return users.getList(params).then(function (response) {
$log("server responded")
return response;
}).catch(function(failure) {
$log.error("server did not respond");
throw failure;
});
};