我们必须从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 :(
}
])
答案 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;
})
})
}])