AngularJS使用任意数据解析AJAX请求,无需进行AJAX调用

时间:2014-09-11 09:25:14

标签: javascript ajax angularjs

我有一个服务,它调用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

我做得好吗?

3 个答案:

答案 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;
        });
    }
};