Javascript jQuery延迟未按预期工作

Javascript jQuery延迟未按预期工作,javascript,jquery,deferred,Javascript,Jquery,Deferred,这是我第一次使用$.Deferred()这证明是一项任务 我已经读过了,但这适用于ajax事件,所以在我的案例中没有真正的帮助 我有以下javascript代码: var deferred = $.Deferred(); deferred.done(function() { console.log(auth.loggedIn); if(auth.loggedIn) { app.page = 'usr/dashboard'; } } deferred.r

这是我第一次使用
$.Deferred()这证明是一项任务

我已经读过了,但这适用于ajax事件,所以在我的案例中没有真正的帮助

我有以下javascript代码:

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');
    }
}
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() {});
},
现在,如果我
console.log(response)
app.api
回调中,如果我
console.log(auth.loggedIn)
我得到
true
,那么响应正是我所期望的

如果我在
deferred.done
console.log
console.log(auth.loggedIn)
(在
initialize
中)得到两个不同的值。我做错了什么,我如何让我的应用程序等待设置
auth.loggedIn

更新 我现在在主文件中就是这样做的:

auth.initialize().done(function(auth) {
    if(auth.loggedIn) {
        app.page = 'usr/dashboard';
    }
    jsRouter.initialize();
});
jsRouter是基于的,现在只是有时候显示模板页面,而不管我在哪个页面上

jsRouter.initialize
函数如下所示:

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');
    }
}
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() {});
},

我已更新了我的
app.api
回调,使其看起来与建议的完全相同。

您当前正在使用
未定义的
解析延迟对象,这没有意义。您还在执行
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)
});
var auth={
洛格丁:错,
初始化:函数(){

var deferred=新的$.deferred();//我认为您在
app.api
调用中使用了deferred,假设它是AJAX调用。似乎您应该
返回调用
app.api
的结果,但是您没有,这会导致使用未定义的负载来解决承诺。app.api看起来可能是异步Javascript…是吗?
app.api
是一个使用ajax调用API的函数。我们刚刚编写了相同的答案。现在,我的路由器,基于if(auth.loggedIn){}
并在之后调用,只是有时会显示模板页面。更新了我的问题,以便在回答后更清楚这是jQuery,因此
返回deferred.promise();
(这是一种方法,而不是属性)。@Roamer-1888:对,也是固定的。没有太注意实际逻辑。