jQuery延迟不按预期工作

时间:2015-07-07 12:39:48

标签: javascript jquery deferred

这是我第一次使用var app = angular.module('myApp', []) app.controller('userCtrl', function($scope) { $scope.statushow = []; $scope.comments = []; $scope.addcomment= function(){ $scope.comments.push({ commentvalue: $scope.commentvalue }); $scope.value=""; }; $scope.addstatus= function(){ $scope.statushow.push({ value: $scope.value }); $scope.value=""; }; }); ,这证明是一项使命。

我已阅读jQuery Deferred not working,但这适用于ajax事件,因此在我的案例中并没有真正帮助。

我在javascript中有以下代码:

$.Deferred();

我的var deferred = $.Deferred(); deferred.done(function() { console.log(auth.loggedIn); if(auth.loggedIn) { app.page = 'usr/dashboard'; } } deferred.resolve(auth.initialize()); 对象如下所示:

auth

现在,如果我在var auth = { loggedIn:false, initialize:function() { var data = { 'login_token':app.getCookie('login_token'), 'usr_id':app.getCookie('usr_id'), 'source':config.source, 'language_code':config.language_code, 'country_code':config.country_code } app.api('usr/loggedin',data,function(data) { var response = JSON.parse(data); if(!response.result) { auth.loggedIn = false; } auth.loggedIn = true; console.log(auth.loggedIn); },'post'); } } 回调中console.log(response),那么回复正是我所期望的,如果我app.api我得到console.log(auth.loggedIn)

如果trueconsole.log deferred.done console.log(auth.loggedIn) initialize,我会得到两个不同的值。我做错了什么以及如何让我的应用等待{ {1}}要设置?

更新

这就是我现在在主文件中执行的操作:

auth.loggedIn

jsRouter基于this 20 line javascript router,现在有时只显示模板页面,无论我在哪个页面。

auth.initialize().done(function(auth) { if(auth.loggedIn) { app.page = 'usr/dashboard'; } jsRouter.initialize(); }); 函数如下所示:

jsRouter.initialize

我已将initialize:function() { window.addEventListener('hashchange',jsRouter.router); window.addEventListener('load',jsRouter.router); /* ERROR PAGES */ jsRouter.route('404','errors/404',function() {}); jsRouter.route('500','errors/500',function() {}); /* ACTUAL PAGES */ jsRouter.route('/','home',function() {}); jsRouter.route('/home','home',function() {}); jsRouter.route('/usr/register','usr/register',function() {}); jsRouter.route('/usr/login','usr/login',function() {}); jsRouter.route('/usr/forgotpassword','usr/forgotpassword',function() {}); jsRouter.route('/usr/activate','usr/activate',function() {}); jsRouter.route('/usr/dashboard','usr/dashboard',function() {}); jsRouter.route('/adr','adr/index',function() {}); }, 回调更新为与Felix King建议的内容完全相同。

1 个答案:

答案 0 :(得分:2)

您目前正在使用undefined解析延迟对象,这没有意义。您还在执行app.api回调之前解析它。 延迟对象必须由异步回调解析。

auth.initialize应该返回延迟的对象/承诺,你必须在app.api回调中解决它:

var auth = {

    loggedIn:false,

    initialize:function() {
       var deferred = new $.Deferred();          // <- create deferred object
        var data = {
            'login_token':app.getCookie('login_token'),
            'usr_id':app.getCookie('usr_id'),
            'source':config.source,
            'language_code':config.language_code,
            'country_code':config.country_code
        }
        app.api('usr/loggedin',data,function(data) {
            auth.loggedIn = JSON.parse(data).result;
            deferred.resolve(auth);              // <- resolve when response was received
        },'post');
        return deferred.promise();               // <- return promise
    }
}

auth.initilize().done(function(auth) { 
  // at this point the login succeeded (or failed)
});