如何将工厂与服务花费太多时间连接?

时间:2013-08-16 17:00:38

标签: angularjs

我们必须从API中检索一些信息,这些信息需要我们在客户端计算的哈希值,但需要花费很长时间才能完成。我们无法与角度循环同步,我们可以做的最多是设置超时来计算散列,但是虽然我们现在得到散列并获取信息,但这会破坏角度循环,我们可以使用它

我们对角度(1.0.7)非常新,我们知道我们遗漏了一些东西,任何有关此事的帮助都会被证实

更新代码省略了一些明显的部分,我想,如果不是这样,请告诉我。

https://code.google.com/p/javascript-bcrypt/和依赖项已正确加载,因此我们创建了一个计算哈希的服务(还有一件事,只需要计算哈希一次)

.service('hashSrv', function(SALT, $q, $timeout) {
    var bcrypt, token = '', secure = '', deferred = $q.defer();

    bcrypt = new bCrypt();
    token = Base64.encode("Sometoken");

    return {
        generate: function() {
            bcrypt.hashpw(token, SALT, function(hash) {
              secure = hash;
            });  
        },
        getSecure: function() {
            return secure;
        },
        getToken: function() {
            return token;
        },
        getData: function() {
            return {
                'token': token,
                'secure': secure
            }
        }
    }
})

这是我们的工厂资源:

.factory('InfoSrv', function ($http, RESOURCE_URL, HashSrv, $timeout) {
    return $timeout( function() {
        $http({method: 'GET', url: 'RESOURCE_URL?token=' + HashSrv.getToken() + '&secure=' + HashSrv.getSecure()})
        .success(function(response, data, status, headers, config) {
            //Here we have the correct response
        })
        .error(function(response, data, status, headers, config) {
            //Check if something bad happens
        });
    }, 200);
})

最后,我们试图在我们的控制器中使用它

.controller('DataCtrl',
    ['$scope', 'InfoSrv', 
    function ($scope, InfoSrv) {
        $scope.user.basicInformation = $scope.getBasicInfo();
        //Here we can get the info :(
    }
])

2 个答案:

答案 0 :(得分:1)

$ timeout服务返回一个promise,并且解析promise的值是传递给$ timeout的函数中返回的值。在你的情况下,你没有在$ timeout内返回任何内容。

我不确定为什么你需要$ timeout。您只需返回$ http(),它也将返回promise。然后将您的成功,错误方法移出服务。

答案 1 :(得分:0)

在hashSrv中,generate()应该返回延迟的承诺

generate: function() {
        bcrypt.hashpw(token, SALT, function(hash) {
            secure = hash;
            deferred.resolve(hash);
        });  
        return deferred.promise;
}

工厂应该像这样返回promise

.factory('InfoSrv', function ($http, RESOURCE_URL, HashSrv, $timeout) {
    return {
        getBasicInfo: function () {
            var promise = $http({
                method: 'GET',
                url: 'RESOURCE_URL?token=' + HashSrv.getToken() + '&secure=' + HashSrv.getSecure()
            }).success(function (response, data, status, headers, config) {
                return data;
            }).error(function (response, data, status, headers, config) {
                //Check if something bad happens
            });
            return promise;
        };
    }
});

您可以在控制器中使用此类服务​​:

.controller('DataCtrl', ['$scope', 'InfoSrv', 'hashSrv', function ($scope, InfoSrv, hashSrv) {
    hashSrv.generate().then(function (hash) {
        InfoSrv.getBasicInfo().then(function (data) {
            $scope.user.basicInformation = data;
        })
    })
}])