如果缓存

时间:2015-06-14 06:59:20

标签: javascript angularjs

我发送一个ajax请求来从服务器获取数据并将其存储在本地变量中。这是内部服务。然后在控制器中我使用promise来在需要时获取数据。它第一次起作用,因为没有检测到缓存并且返回了promise,但是下次我没有从服务函数返回任何promise,因此javascript错误。

我在服务中的功能是:

    getProductDetails: function(product) {
        if(!productDetailsArr[product.id]) {
            if (!promiseProductDetails) {
                // $http returns a promise, which has a then function, which also returns a promise
                promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) {
                    productDetailsArr[product.id] = response;
                    return productDetailsArr[product.id];
                });
            }
            // Return the promise to the controller
            return promiseProductDetails;
        } else {
            return productDetailsArr[product.id];
        }

    }

在控制器中,我使用以下代码调用了上述函数:

ServiceData.getProductDetails($scope.product).then(function(data) {
    $scope.productDetails = data;
});

所以第二次我得到JS错误:

TypeError: ServiceData.getProductDetails(...).then is not a function

任何想法如何解决这个问题。

1 个答案:

答案 0 :(得分:5)

你应该做的是总是回报一个承诺。在这种情况下,您只需返回已解决的承诺。您可以阅读有关此here的更多信息。

    if(!productDetailsArr[product.id]) {
        if (!promiseProductDetails) {
            // $http returns a promise, which has a then function, which also returns a promise
            promiseProductDetails = $http.get(product.id + '/productdetails.json').then(function(response) {
                productDetailsArr[product.id] = response;
                return productDetailsArr[product.id];
            });
        }
        // Return the promise to the controller
        return promiseProductDetails;
    } else {
        var deferred = $q.defer();
        deferred.resolve(productDetailsArr[product.id]);
        return deferred.promise;
    }