Это мой первый раз, когда я использую $.Deferred();
, и это оказалось миссией.
Я прочитал jQuery 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');
}
}
Теперь, если я console.log(response)
в обратном вызове app.api
, ответ будет именно таким, каким я его ожидаю, если я console.log(auth.loggedIn)
получу true
.
Если я console.log
в deferred.done
и console.log(auth.loggedIn)
(в initialize
я получаю два разных значения. Что я делаю неправильно и как я могу заставить свое приложение ждать установки auth.loggedIn
?
ОБНОВИТЬ
Вот как я сейчас это делаю в своем основном файле:
auth.initialize().done(function(auth) {
if(auth.loggedIn) {
app.page = 'usr/dashboard';
}
jsRouter.initialize();
});
jsRouter основан на этом 20-строчном маршрутизаторе JavaScript и теперь только иногда показывает страницу шаблона, независимо от того, на какой странице я нахожусь.
Функция 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 предложил.
app.api
, предполагая, что это вызов AJAX. - person Marcos Pérez Gude   schedule 07.07.2015return
получить результат вызоваapp.api
, но это не так, что приводит к разрешению промиса с неопределенной полезной нагрузкой. - person Jon   schedule 07.07.2015app.api
— это функция, которая использует ajax для вызовов API. - person Bird87 ZA   schedule 07.07.2015