在使用$ http.jsonp时,如何仅将response.data发送到我的控制器而不是整个响应?

时间:2016-03-23 14:37:13

标签: angularjs

我有决心进行webapi调用,以便将数据传递给各种控制器。但它总是将带有HTTP头/等的完整响应发送到控制器而不仅仅是数据。所以我的控制器必须访问这样的数据:

response.data.myObj1response.data.myObj2

我只想要data.myObj1data.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)的数据对象上的任何对象时,最后两个给出了未定义的错误。

1 个答案:

答案 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()减少您的响应对象并将其发送到您的调用代码,在这种情况下是控制器。

希望这有助于解释发生的事情。