【发布时间】:2017-08-04 23:18:31
【问题描述】:
我迷路了,不知道在这方面要查找什么。我知道这可能与 jQuery 承诺有关。所以,直截了当,我试图将“pass”变量作为布尔值返回,以检查电子邮件是否有效。而不是通过 value = "asdf" 传递 false,它仍然传递 true。我知道这是因为异步请求,我只是不确定如何推迟该变量。代码如下:
console.log( this.newValidate($('#forgottenPwdForm'))); // Returns true
newValidate: function(form){
var $form = form,
errmsg = function(msg){
return '<span class="error" style="text-align:right; margin: 2px 15px; color:red;">' + msg + '</span><br/>';
};
// Check email / username
// Needs to run 2 validations. Is the email valid? And is it duplicate if valid
if($form.find('.email').length)
$form.find('.email').each(function(){
var email = escape($(this).val().trim()),
valid = true,
duplicate = false,
pass = true;
// Check if email is valid
$.when(
$.get('/service/account/ajaxdata?method=validemail&emailaddr='+email, function(res){
console.log(res);
valid = res;
}),
$.get('/subscribe/check_email?email=' + email, function(data) {
if(data){
duplicate = false; }
})
).then(function(){
if(valid == 0){
var error = errmsg("Email is not valid.");
pass = false;
console.log(pass);
}
else {
// Now that the email is valid, we need to check if it's duplicate
if(duplicate == false) {
$('.email').addClass('emailError');
pass = false;
}
else {
if($('.email').hasClass('emailError')) {
$('.email').removeClass('emailError');
$('.email').removeClass('error');
}
pass = true;
}
}
});
if(pass == false) return pass;
});
代码在应该返回 false 时返回 true。同样,我知道这与 $.get 请求和变量超出范围有关,我只是不确定如何推迟它。
【问题讨论】:
-
直到这条线
if(pass == false) return pass;之前看起来不错,它超出了承诺,所以首先执行。当isvalid()进行 ajax 调用时,您根本无法进行“if (isvalid()==true)”类型测试(但我怀疑您已经知道这一点)。有关更多信息,请参见此处:stackoverflow.com/questions/14220321/… -
我明白,但是整个方法的 newValidate 方法实际上有更多的检查,例如检查 '.required' / '.passwd' 类,并根据返回 false那些通过与否。错误的返回会阻止表单被发布(未显示)。目前正在检查该链接。
标签: jquery asynchronous promise deferred