我知道Angular可以处理控制器内的promise。例如:
function MyCtrl($scope) {
$scope.myvar = getDeferredPromise();
}
主角度摘要循环优雅地处理这个问题,将延迟函数最终返回的任何值分配给 myvar 。
但是,虽然 $ http.get()方法返回一个promise,但我无法以这种方式工作。例如:
function MyCtrl($scope, $http) {
$scope.myvar = $http.get('/url');
}
get方法返回的'promise'有一个 success 方法,该方法接受一个函数,该函数分配了一个人希望分配给 myvar <的数据/强>
但是,它还有一个 然后 方法 - 但是它给出了整个响应对象 - 而不仅仅是那个数据部分!这似乎最终被分配到 myvar !
这个小提琴可能会有所帮助:http://jsfiddle.net/QKnNC/1/
我在这里做错了吗?或者这是“按设计”?
答案 0 :(得分:1)
$ http服务是一个带有单个参数的函数 - a 配置对象 - 用于生成HTTP请求和 使用两个$ http特定方法返回一个promise:成功和错误。
$http
会返回一个承诺,因此您需要链接then
才能获取数据。
IPService.getV1().then(function (response) {
console.log(response)
$scope.value1 = response.data;
});
答案 1 :(得分:1)
then
是一般承诺函数,它接受成功和错误回调,并获得已解析的值,无论它是什么。 success
和error
是$http
特有的,并且是then
的别名,但有一个例外:它们设置了一堆有用的参数而不仅仅是数据。请参阅the source。
答案 2 :(得分:0)
这是设计的。您的getV2()
方法就是您想要的。由于您使用的是GET,因此您可以保存承诺的结果,并在随后的getV2()
调用中返回该结果:
var v2promise, v2data;
return {
getV2: function() {
if(!v2promise) {
v2promise = $http.get('http://ip.jsontest.com/').then(
function(response) {
v2data = response.data;
return v2data;
});
}
return v2promise;
}
}