我有一个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
承诺?
答案 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承诺的工作方式略有不同,一个包裹另一个而不是展开。