尝试从jQuery.get()返回一个值,总是以未定义的方式结束

时间:2016-06-23 04:11:31

标签: javascript jquery

现在我正在使用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");
  });
}

它适用于无效和有效的网址。我在哪里错了?

1 个答案:

答案 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);