javascript - jQuery 延迟未按预期工作

标签 javascript jquery deferred

这是我第一次使用 $.Deferred();,事实证明这是一个使命。

我已阅读jQuery Deferred not working ,但这适用于 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');
    }
}

现在,如果我在 app.api 回调中 console.log(response) ,那么响应正是我所期望的,如果我 console.log(auth.loggedIn) 我得到true

如果我在 deferred.doneconsole.logconsole.log(auth.loggedIn) (在 initialize code> 我得到两个不同的值。我做错了什么以及如何让我的应用程序等待 auth.loggedIn 设置?

更新

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

auth.initialize().done(function(auth) {
    if(auth.loggedIn) {
        app.page = 'usr/dashboard';
    }
    jsRouter.initialize();
});

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

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

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

最佳答案

您当前正在使用 undefined 解析延迟对象,这是没有意义的。您还在执行 app.api 回调之前解决它。 延迟对象必须通过异步回调来解析。

auth.initialize 应该返回延迟对象/ promise ,并且您必须在 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)
});

关于javascript - jQuery 延迟未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31268782/

相关文章:

javascript - 从 QWebView *Google Maps API、PyQT* 运行 JavaScript 函数

javascript - 从 previousElementSibling 获取隐藏的输入值

javascript - jquery中从json数组中分割json数据

javascript - 在没有 Promise 或任何 JS 库的情况下延迟函数执行

python - 应如何取消 Twisted AMP 延迟?

javascript - 如何在 Javascript 中找到对象的第一个元素?

javascript - jQuery UI 日期选择器 - 禁用公共(public)假期、周末、上午 10 点后的第二天,仅允许星期二、星期三和星期四作为可选日期

javascript - 使用数据库制作动态下拉菜单

php - 两个循环 JS 函数相互冲突

javascript - 在延迟/ promise 实现中使用计时器是一种邪恶吗?