【发布时间】:2013-02-26 19:28:29
【问题描述】:
在为会员或客人准备页面之前,我正在检查用户是否已登录。如果他们有 cookie,他们就是会员,如果没有,他们就是客人。
我做得对吗?
function check_if_member(){
var dfd = new $.Deferred();
if (readCookie('isco')){
//adds jquery data() element "user_information"
//after making a jquery ajax post to retrieve it
//and using a template to write data to the page
//with the `success()` callback
prepare_member('member');
} else {
//reveals some HTML on the page
prepare_member('guest');
}
}
$(document).ready(function(){
//before page loads, check if user is member
$.when(check_if_member())
.then(function(){
console.log($('body').data('user_information'));
return false;
});
});
我想我终于对 deferred 有了一些了解,但它们仍然让我感到困惑,我想知道我是否已经适当地构造了这个,或者我是否需要在我的任何 ajax 请求中添加解析或返回行或将收集到的信息保存到 jquery data() 的行。谢谢。
编辑
prepare_member 函数
function prepare_member(type) {
if (type == 'member') {
var user_information = readCookie('isco')
$('body').data('user_information', user_information);
var user_id = $('body').data('user_information').user_id;
$.ajax({
type: 'post',
url: "/address.php",
data: {
type: "retrieve",
user_id: user_id,
isbilling: true
},
dataType: 'json',
success: function (returnedData) {
$('body').data('user_information').billing_information = returnedData['address_0'];
//populate member billing fields
$('#member_billing_container').append('<div>').children(':last')
.vkTemplate('/member_billing_template.tmpl', returnedData, function () {
//some callback - possibly resolve promise
});
//populate member contact fields
$('#member_contact_container').append('<div>').children(':last')
.vkTemplate('/member_contact_template.tmpl', JSON.stringify(user_information), function () {
//some callback - possibly resolve promise
});
}
});
$('.guest_container, .guest').hide();
$('.member_container, .member').show();
} else {
$('.guest_container, .guest').show();
$('.member_container, .member').hide();
}
}
【问题讨论】:
-
是的,你必须解决 Deferred,否则传递给
then()的函数将永远不会被调用。您还需要从check_if_member()返回 Deferred 的承诺。 -
@FrédéricHamidi 谢谢。你能告诉我这些线的确切位置吗? `在ajax成功回调中解析?
-
如果你用
prepare_member()的代码更新你的问题我可以试试:) -
@FrédéricHamidi 当然。两秒钟。让我做一个简短的版本。
-
@FrédéricHamidi 已更新,感谢您的关注!