0

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

我们对 angular (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 :(
    }
])
4

2 回答 2

1

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

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

于 2013-08-16T17:50:04.187 回答
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;
        })
    })
}])
于 2013-08-16T18:21:11.320 回答