我的函数类似于下面的getData函数。
我知道$ http会返回一个承诺。在我目前的设置中,我使用$ q以便我可以对结果进行一些处理然后返回另一个承诺:
var getData = function (controller) {
var defer = $q.defer();
$http.get('/api/' + controller + '/GetData')
.success(function (data) {
var dataPlus = [{ id: 0, name: '*' }].concat(data);
defer.resolve({
data: data,
dataPlus: dataPlus
});
})
.error(function (error) {
defer.reject({
data: error
});
});
return defer.promise;
}
有什么方法可以做到这一点,而不需要使用AngularJS $ q(或任何其他$ q实现)或上面的代码是唯一的方法吗?请注意,我不是在寻找一个解决方案,我将onSuccess和onError传递给getData作为参数。
由于
答案 0 :(得分:5)
正如您所说$http.get
已经返回一个承诺。有关承诺的最好的事情之一是它们很好地构成。添加更多success
,then
或done
只是按顺序运行它们。
var getData = function (controller) {
return $http.get('/api/' + controller + '/GetData')
.success(function (data) {
var dataPlus = [{ id: 0, name: '*' }].concat(data);
return {
data: data,
dataPlus: dataPlus
};
})
.error(function (error) {
return {
data: error
};
});
}
这意味着使用getData(controller).then(function (obj) { console.log(obj) });
将打印成功处理程序返回的对象。
如果您愿意,可以继续撰写,添加更多功能。假设您希望始终记录结果和错误。
var loggingGetData = getData(controller).then(function (obj) {
console.log(obj);
return obj;
}, function (err) {
console.log(err);
return err;
});
然后您可以像这样使用您的日志记录getData
:
loggingGetData(controller).then(function (obj) {
var data = obj.data;
var dataPlus = obj.dataPlus;
// do stuff with the results from the http request
});
如果$http
请求解析,结果将首先通过您的初始成功处理程序,然后通过日志记录,最后在此处的最终函数中结束。
如果它没有解决,它将通过初始错误处理程序到loggingGetData
定义的错误处理程序并打印到控制台。您可以继续以这种方式添加承诺并构建非常先进的东西。
答案 1 :(得分:0)
您可以尝试:
使用提供response
方法的interceptor。但是我不喜欢它,因为它将处理响应的代码移动到另一个地方,使得理解和调试代码变得更加困难。
在这种情况下,使用$ q将是最好的IMO。
另一个(更好?)选项是transformResponse
调用的本地增强$http.get()
transformer,只返回$ http承诺。