jQuery验证,在继续之前等待服务调用响应
jQuery validation, waiting for service call response before proceeding
我目前有一个jQuery方法来验证英国电话号码。这只是验证格式,并不能确保号码是真实的,所以我正在尝试一种电话验证服务。
下面的代码显示了jQuery验证方法,其最后一个IsValid(phone_number,'GB')位调用处理服务的函数。
jQuery.validator.addMethod('phonesUK', function(phone_number, element) {
phone_number = phone_number.replace(/'(|')|'s+|-/g,'');
return this.optional(element) || phone_number.length > 8 &&
phone_number.match(/^(?:(?:(?:00's?|'+)44's?|0)(?:1'd{8,9}|[23]'d{9}|8'd{7,9}|7(?:[45789]'d{8}|624'd{6})))$/)
&& IsValid(phone_number, 'GB');}, 'Please specify a valid UK phone number');
下面的代码处理对服务的调用,并且单独运行很好。
function IsValid(telephoneNumber, defaultCountry)
{
var internationaltelephonevalidation = new data8.internationaltelephonevalidation();
internationaltelephonevalidation.isvalid(
telephoneNumber,
defaultCountry,
[
new data8.option('UseMobileValidation', 'true'),
new data8.option('UseLineValidation', 'true')
],
showIsValidResult
);
}
function showIsValidResult(result) {
if (!result.Status.Success) {
alert('Error: ' + result.Status.ErrorMessage);
}
else {
if(result.Result.ValidationResult == "Invalid"){
return false;
}else{
return true;
}
}
}
我的问题是,在服务返回响应之前,jQuery验证器方法返回false。
我确实在jQuery方法中尝试了设置超时,并在从showIsValidResult()函数返回之前设置了一个变量,但该变量始终未定义。
有什么想法吗?
感谢
internationaltelephonevalidation.isvalid
是一个异步XHR调用。它在IsValid
函数中执行,但函数不等待响应。相反,它只是返回undefined
,因为它是JavaScript中的默认返回语句。
isValid
函数可以使用$.Deferred对象重写:
var funReady;
function IsValid(telephoneNumber, defaultCountry) {
funReady = new $.Deferred();
var internationaltelephonevalidation = new data8.internationaltelephonevalidation();
internationaltelephonevalidation.isvalid(
telephoneNumber,
defaultCountry,
[
new data8.option('UseMobileValidation', 'true'),
new data8.option('UseLineValidation', 'true')
],
showIsValidResult
);
$.when(funReady).then(function() {
// no action needed after $.Deferred is resolved/rejected.
// just waiting for it to happen without leaving isValid
// function ...
});
return funReady.state() === "resolved" ? true : false;
}
function showIsValidResult(result) {
if (!result.Status.Success) { // http(s) request failed
funReady.reject();
}
if(result.Result.ValidationResult == "Invalid") {
funReady.reject();
} else {
funReady.resolve();
}
}
Deferred对象返回一个promise。默认情况下,其状态为"挂起",这意味着既不是"已解决"(成功)也不是"已拒绝"(失败)。当promise处于"挂起"状态时,$.when()
函数会等待其状态更改为"已解决"/"已拒绝"。
一旦异步XHR请求完成/失败,就会以编程方式更改Deferred状态。
此解决方案是一个演示。您应该考虑检查$.Deferred
是否已经创建,而不是为每个isValid
调用重新创建新实例。这个建议可能还有其他边缘案例,但它应该会帮助你找到正确的答案。
相关文章:
- 如何使用WCF服务和javascript表单post上传.doc文件
- 监视函数从服务返回不起作用,但作用域函数起作用
- AngularJS Protractor:正在等待服务回调
- 我怎么能在Angular JS中等待,直到我的web服务返回
- 必须等待执行 jQuery,直到加载服务
- md自动完成don't等待来自服务的数据.如何解决
- jQuery验证,在继续之前等待服务调用响应
- 在测试之前,需要量角器等待服务返回
- $save().then 在 Angular 上$resource不等待服务响应
- 使用$timeout等待服务数据解析
- 在服务中等待 Angular JS(REST -> $resource)
- 在web应用程序中程序化地等待web服务响应
- 如何在等待长WCF服务调用时在asp文本框上显示消息
- Javascript SignalR等待服务广播所有消息
- Node.js等待REST服务的回调,使HTTP请求
- Node.js脚本应该在服务运行之前等待
- Angular js会等待服务调用返回
- Angular等待Ajax完成服务功能
- Angular:在我在控制器中设置返回值之前,我怎么能等待服务中的承诺被解析呢?
- 角度.js - 在控制器中等待服务从服务器返回值