我有决心进行webapi调用,以便将数据传递给各种控制器。但它总是将带有HTTP头/等的完整响应发送到控制器而不仅仅是数据。所以我的控制器必须访问这样的数据:
response.data.myObj1
和response.data.myObj2
我只想要data.myObj1
和data.myObj2
。
现在我的决心看起来像这样:
resolve: {
eventData: function ($stateParams, $http) {
return $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK');
}
}
但我也试过这个:
resolve: {
eventData: function ($stateParams, $http) {
$http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').success(function(data){
return data;
});
}
}
和此:
resolve: {
eventData: function ($stateParams, $http) {
$http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').then(function(response){
return response.data;
});
}
}
当我尝试访问发送到控制器(eventData)的数据对象上的任何对象时,最后两个给出了未定义的错误。
答案 0 :(得分:1)
$http
返回承诺。这就是所有.then
,.catch
语法都是。
它允许您在promise解析时运行代码以及什么促进了链能力。
您操纵通过该承诺链运行的数据,因此当承诺结算时,每个.then()
内部。这意味着可以创建并返回一个承诺,.then
可以附加到它,但它不会被“激活”,直到它结算。在你的情况下,AJAX返回。一旦解决它运行所有.then
将所有数据从一个链中发送到另一个链中,允许您对其进行操作。
因此,为了回答您的问题,您将在退出服务之前拦截您的保证链,并在数据返回控制器之前操纵数据。
非常类似于您的上一个代码段,除了一位,$http
之前的额外回报。
resolve: {
eventData: function($stateParams, $http) {
return $http.jsonp('http://localhost:10569/api/eventView/1?callback=JSON_CALLBACK').then(function(response) {
return response.data;
});
}
}
返回非常重要,此时您没有返回整个响应对象,因为那时您的AJAX请求将无法解决。你正在做的是用链式.then()
返回一个promise对象。
当AJAX返回时,它将解析承诺并运行.then()
减少您的响应对象并将其发送到您的调用代码,在这种情况下是控制器。
希望这有助于解释发生的事情。