【问题标题】:AngularJS Bypass promise if data is present in cache如果数据存在于缓存中,AngularJS 绕过承诺
【发布时间】:2015-08-29 20:40:33
【问题描述】:

我正在发送一个 ajax 请求以从服务器获取数据并将其存储在本地变量中。这是内部服务。然后在控制器中,我使用承诺在需要时获取数据。这是第一次工作,因为没有检测到缓存并返回承诺,但下一次我没有从服务函数返回任何承诺,因此出现 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

知道如何解决这个问题。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    你应该做的是总是返回一个承诺。在这种情况下,您可以简单地返回一个已经解决的承诺。你可以阅读更多关于这个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;
        }
    

    【讨论】:

    • else 块可以更短:return $q.when(productDetailsArr[product.id]);
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多