来自控制器的AngularJS服务调用无法正常工作

时间:2014-09-28 04:01:18

标签: angularjs

我用函数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');
        },

2 个答案:

答案 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调用的完成,如果你在其他地方访问数据的话。