为什么$ q承诺返回$ http承诺作为有效载荷?

时间:2014-06-10 22:46:33

标签: angularjs promise angular-services

我有一个promise链,它必须在链中间调用$http并将生成的promise传递给下一个处理程序。问题是我的.then()成功函数似乎将返回的$http承诺包装在另一个承诺中,导致我的http承诺被视为有效负载。因此,当它在链中的下一个链接中解析时,我得到一个承诺而不是http响应。

var statusPromise = Auth.getUserStatus();

var tokenPromise = statusPromise.then(function(status) {
    if (status && status.accesstoken) {
        return status.accesstoken;
    } else {
        return null;
    }
});

var httpPromise = tokenPromise.then(function(accesstoken) {
    console.log('access token', accesstoken);
    var params = {
        page: page,
        limit: limit
    };

    if (accesstoken) {
        params.accesstoken = accesstoken;
    }

    return $http.get(apiUrl + 'scenes/' + filter + '/', {
        data: $.param(params),
        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
    });
});

var doMoreStuffPromise = httpPromise.then(function(response) {
    console.log(response); // this logs the promise as the payload, not the http response
    return response.data;
});

return doMoreStuffPromise;

如何在我的链中链接$http承诺?

2 个答案:

答案 0 :(得分:1)

$http调用返回承诺,并且承诺递归地同化......问题不在于承诺。问题出在$http API上。事实上,像$ q这样的Promises / A +实现很难在没有展开的情况下返回一个可用的。

如果您使用.then(在成功案例中),其使用方式与使用.success的方式不同,除了.success不链接,resolves with .data

您的代码也应该这样做:

var doMoreStuffPromise = httpPromise.then(function(rep) {
    console.log(resp.data);  // now, your actual data
    return resp.data;
});

答案 1 :(得分:1)

我想出了这个问题。它发生在链条上比我预期的更进一步。事实证明我的Auth服务有一个错误:

this.getUserStatus = function() {
    $.when(...); // woops, no $q
};

应该是:

this.getUserStatus = function() {
    $q.when(...);
};

我不小心忘记了$q,因为$.when()是用于创建承诺的合法jQuery函数,所以没有任何失败。然而,由于角度和jquery承诺的工作方式略有不同,一个包裹另一个而不是展开。