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:对,也是固定的。没有太注意实际逻辑。