现在我正在使用jQuery / Javascript进行表单验证,我有一个用户可以输入URL的输入。我创建了一个名为urlError
的函数,它检查URL是否存在,如下所示:
var urlErrorExist = urlError("some_url");
function urlError(url) {
$.ajaxPrefilter( function (options) {
if (options.crossDomain && jQuery.support.cors) {
var http = (window.location.protocol === 'http:' ? 'http:' : 'https:');
options.url = http + '//cors-anywhere.herokuapp.com/' + options.url;
//options.url = "http://cors.corsproxy.io/url=" + options.url;
}
});
var error;
$.get(url, function() {
error = false;
}).fail(function() {
error = "URL is invalid";
});
return error;
}
我的逻辑是,如果URL存在,我将变量error
设置为false,如果有错误,请将错误设置为字符串URL is invalid
。最后我返回错误的值,在这种情况下,我可以测试是否有错误,如果有,则显示"URL is invalid"
字符串到页面。但是,error
变量在将其记录到控制台时始终以未定义的形式结束。我已经尝试使用警报来查看$.get
实际上是否正常工作:
$.get(url, function() {
alert("URL is valid");
}).fail(function() {
alert("URL is invalid");
});
}
它适用于无效和有效的网址。我在哪里错了?
答案 0 :(得分:3)
您的函数在请求可能完成之前返回方式,因此返回发送未定义,因为它中不存在任何值。要测试它,请尝试在错误变量中添加默认值。
为什么?
由于它是异步http调用,服务器可能需要时间来响应,但是由于你从成功和错误回调之外返回,返回发生在你的调用(GET)执行之前,因此没有设置任何值,所以它那里有一个未定义的值。
尝试为错误添加默认值以了解更多信息。
var error = "blah";
$.get(url, function() {
error = false;
}).fail(function() {
error = "URL is invalid";
});
return error;
更好的方法
在这里,你可以让每个函数都执行自己的任务,并且更具可读性。
function doAjax(url, successCallback, failureCallback) {
$.get(url, function() {
error = false;
successCallback(error);
}).fail(function() {
error = "URL is invalid";
failureCallback(error);
});
}
function successCallback(errorString){
//do something here, but be happy as it executed well :D
}
function errorCallback (errorString) {
//do something here, be sad because it didn't
}
doAjax("http://google.com",successCallback, errorCallback);