Javascript 我可以在不使用$q的情况下对AngularJS$http调用的结果进行操作并转发吗?
我有下面的getData函数 我知道$http返回一个承诺。在我目前的设置中,我使用$q,这样我可以对结果进行一些处理,然后返回另一个承诺:Javascript 我可以在不使用$q的情况下对AngularJS$http调用的结果进行操作并转发吗?,javascript,angularjs,Javascript,Angularjs,我有下面的getData函数 我知道$http返回一个承诺。在我目前的设置中,我使用$q,这样我可以对结果进行一些处理,然后返回另一个承诺: var getData = function (controller) { var defer = $q.defer(); $http.get('/api/' + controller + '/GetData') .success(function (data) { var dataPlus = [{
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的解决方案
谢谢就像你说的那样,
$http.get
已经返回了一个承诺。关于承诺,最好的一点是,它们写得很好。添加更多的成功
,然后
,或完成
只需按顺序运行它们
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(函数(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
定义的错误处理程序,并打印到控制台。您可以继续以这种方式添加承诺,并构建真正高级的东西。正如您所说的,$http.get
已经返回了承诺。关于承诺,最好的一点是,它们写得很好。添加更多的成功
,然后
,或完成
只需按顺序运行它们
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(函数(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
定义的错误处理程序,并打印到控制台。您可以通过这种方式不断添加承诺,构建真正高级的东西。您可以尝试:
使用提供响应
方法的。但是我不喜欢它,因为它将处理响应的代码移到了另一个地方,使得理解和调试代码变得更加困难
在这种情况下,使用$q将是最好的
另一个(更好的?)选项是对$http.get()
调用进行本地增强的transformResponse
,只需返回$http承诺即可。您可以尝试:
使用提供响应
方法的。但是我不喜欢它,因为它将处理响应的代码移到了另一个地方,使得理解和调试代码变得更加困难
在这种情况下,使用$q将是最好的
另一个(更好的?)选项是对$http.get()
调用进行局部增强的transformResponse
,只返回$http承诺。$http.get
本身返回承诺。您可以返回它?$http.get
本身返回一个承诺。您可以退回吗?.error
是否退回原始承诺?您不需要从.get
返回结果吗?@RGraham.error
和.success
返回相同的承诺链。您的.error回调中的defer.reject()未定义。你是想删除或更改它吗?谢谢Erik,在文档中找不到关于那些http特定方法的任何内容returned@ErikKronberg-谢谢你的回答。为了清楚起见,您是否可以更新您的答案,以显示出现错误的情况,并在返回之前进行了预处理。为了让问题更清楚,我只是对这个问题做了一个小改动。我很想看看代码。谢谢。是否返回原始承诺?您不需要从.get
返回结果吗?@RGraham.error
和.success
返回相同的承诺链。您的.error回调中的defer.reject()未定义。你是想删除或更改它吗?谢谢Erik,在文档中找不到关于那些http特定方法的任何内容returned@ErikKronberg-谢谢你的回答。为了清楚起见,您是否可以更新您的答案,以显示出现错误的情况,并在返回之前进行了预处理。为了让问题更清楚,我只是对这个问题做了一个小改动。我很想看看代码。谢谢