我用函数is_authenticated()编写了一个服务Auth,返回$http.get('/api/users/is_authenticated')
当我在浏览器中访问API端点时,我看到了正确的JSON。
用户进行身份验证时 {"authenticated":true}
,而用户未经过身份验证时为<。
但是,我的console.log()会在100%的时间内返回false(并且它也会记录两次,而不只是一次)。
这里有什么问题?
var is_authenticated = false;
Auth.is_authenticated()
.success(function(data) {
is_authenticated = data.authenticated;
});
console.log(is_authenticated);
服务:
.factory('Auth', function($http) {
return {
is_authenticated: function() {
return $http.get('/api/users/is_authenticated');
},
答案 0 :(得分:2)
console.log()接受对指定对象的引用,并立即运行(通常是后台)进程将其写入日志。它的写作完全取决于时间。您使用异步调用遇到了很多 - 如果您使用调试器单步调试或设置断点,它将打印正确的值。如果你原始运行它,它会失败。这是因为它在您的网络请求完成之前正在执行。
在成功函数中移动console.log:
Auth.is_authenticated().success(function(data) {
is_authenticated = data.authenticated;
console.log(is_authenticated);
});
您还应该捕获此调用的可能失败。如果您遇到任何类型的错误(例如CORS违规,Chrome现在默认启用),您将永远不会遇到此代码块,您仍然会摸不着头脑:
.error(function(data, status, headers, config) {
console.log('Fail!');
});
最后,请注意虽然Factories是有用的模式,但除非您专门使用它们的行为方式,否则通常可以通过将它们作为服务来保存一行或两行代码。您不需要返回对象 - 您只需在'this'上设置属性和方法。
这可能非常重要,因为您构建了更强大的服务,例如身份验证服务提供商,您真正希望这些服务是单身人士......
答案 1 :(得分:0)
一种方法是在访问成功函数之外的数据时使用$ timeout。只需设置合理的延迟。
另一种方法是在访问数据之前使用success()内的$ broadcast来表示ajax调用的完成,如果你在其他地方访问数据的话。