Service中包含的$ http请求返回解析状态Provider中的整个响应

时间:2016-11-05 14:15:55

标签: angularjs angular-ui-router

我的状态定义如下:

.state('list', {
            url: '/list',
            controller: 'ctrl',
            resolve: {
                data: ['DataService', function(DataService) {                                 
                    return DataService.getList();
                    }]
            }
        })

DataService的getList发出http请求:

    var httpRequest = $http(categoryRequest);
        httpRequest.then(function (response) {
                 return response.data;
            })
            .catch(function (error) {
                console.log('could not get categories from server');
            });

        return httpRequest;

在控制器中我只是将列表分配给它的列表属性:

function ctrl(data) {
    this.list = data.data;
}

问题:

无论我成功回复http请求,我总是得到国家提供商解决的整个响应。

所以我必须在控制器中执行 data.data 以从响应中获取数据。

问题:

  1. 我的假设是真的,我会永远得到全部的回应吗?
  2. 如何获取我无需在控制器中获取的数据表单响应。
  3. 致以最诚挚的问候,

2 个答案:

答案 0 :(得分:1)

var httpRequest = $http(categoryRequest);

所以httpRequest是Promise<Response>

httpRequest.then(function (response) {

这创造了另一个承诺,但这个新承诺没有分配给任何东西。

return httpRequest;

这会返回原始Promise<Response>

你想要

httpRequest = httpRequest.then(function (response) {

或者只是

return httpRequest.then(function (response) {

所以你返回的是新的承诺。

为了给您一个更简单的模拟示例,您的代码类似于

var a = 1;
a + 1;
return a;

返回1,而不是2。

要返回2,您需要

var a = 1;
a = a + 1; 
return a;

var a = 1;
return a + 1;

答案 1 :(得分:0)

有两个问题。首先,服务返回原始的httpPromise而不是从原始promise中派生的promise。其次,错误处理程序将拒绝转换为成功。

var httpRequest = $http(categoryRequest);
    //httpRequest.then(function (response) {
var derivedPromise = httpRequest.then(function onSuccess(response) {
    //return to chain data
    return response.data;
}).catch(function onReject(error) {
    console.log('could not get categories from server');
    //IMPORTANT to avoid conversion
    throw error;
    //OR
    //return $q.reject(error);
});

//return httpRequest;
return derivedPromise;

promise的.then方法返回从原始promise中派生的新promise。它并没有改变最初的承诺。

一个常见问题是来自拒绝处理程序的throwreturn $q.reject语句的遗漏。没有此类语句的函数会返回undefined的值,该值将转换拒绝成功,并将其解析为undefined