我有一个服务,它调用URL来获取用户的详细信息。
...
this.getUserDetail = function (userId) {
// deal cache
var request = $http({
method: "get",
url: "/users/"+userId
});
return request.then(successFn, errorFn);
};
但是在另一个地方,我也在提取用户详细信息并创建新获取用户的地图。我想从我的JavaScript对象中重用已经获取的用户。
this.getUserDetail = function (userId) {
if (userMap[userId]) {
return $q.resolve({
'result': userMap['userId']
});
}
var request = $http({
method: "get",
url: "/users/"+userId
});
return request.then(successFn, errorFn);
};
但这不起作用。我收录了$q
。我没有收到JavaScript错误,除了在我使用this.getUserDetail(userId).then(...
的地方,它会抛出错误,因为我可能没有从我这样做的方式返回succesFn
。
我做得好吗?
答案 0 :(得分:2)
您调用的函数是使用AJAX。
现在,根据您的问题,由于您使用然后,this.getUserDetail(userId).then()
,这意味着getUserDetail
必须自行返回承诺 < / em>的
现在,如果我理解正确,您希望使用随机数据解析承诺,而不会在缓存项目时调用AJAX。 在这种情况下,让你的函数有条件地使用promise对象。
this.getUserDetail = function (userId) {
var cachedUser = userMap(userId),
deferredData = $q.defer();
var request = cachedUser ? deferredData.promise : $http({
method: "get",
url: "/users/" + userId
});
if (cachedUser) {
deferredData.resolve({
'data': {
'result': cachedUser
}
});
}
return request.then(successFn, errorFn);
};
修改强> :
然后在控制器中使用它:
this.getUserDetail.then(function(response){
// this response object is same object with which
// promise was resolved.
// Doesn't matter whether the promise was AJAX or your own deferred.
});
无论承诺是AJAX还是您自己的延期。
答案 1 :(得分:0)
您可以使用内置缓存中的AngularJs:
var request = $http({
method: "get",
url: "/users/"+userId,
cache: true
});
答案 2 :(得分:0)
this.getUserDetail = function (userId) {
if (userMap[userId]) {
return $q.when(userMap[userId]);
} else {
return $http({
method: "get",
url: "/users/"+userId
})
.then(function (result) {
// add to userMap;
return result;
});
}
};