使用ajax的javaScript返回函数

使用ajax的javaScript返回函数,javascript,ajax,return-value,Javascript,Ajax,Return Value,可能重复: 我不明白为什么goodPassword总是返回undefined 我相信这只是一个愚蠢的错误,我会感激你的回答 function foo(){ var goodPassword; jQuery.ajax({ data: "action=Potato", url: 'servletPotato', timeout: 2000, error: function() { consol

可能重复:

我不明白为什么
goodPassword
总是返回
undefined
我相信这只是一个愚蠢的错误,我会感激你的回答

function foo(){
    var goodPassword;
    jQuery.ajax({
        data: "action=Potato",
        url: 'servletPotato',
        timeout: 2000,
        error: function() {
            console.log("Failed to send ajax");
        },
        success: function(r) {
            var data = jQuery.parseJSON(r);
            if(data.aprovePassword == "true")
            {
                goodPassword = true;
            }
            else
            {
                goodPassword = false;
            }
        }
    });
    return goodPassword;
}

ajax调用确实在工作,数据也在传输中。ProvePassword从servlet返回时肯定是“false”

,因为
goodPassword
还没有分配任何内容,因为XHR请求在函数结束后执行,这就是为什么在函数结束时没有分配任何内容。另一个函数是:

function foo(successCallback) {
    var goodPassword;
     jQuery.ajax({
         data: "action=Potato",
         url: 'servletPotato',
         timeout: 2000,
         error: function() {
            console.log("Failed to send ajax");
         },
         success: function(r) {
            var data = jQuery.parseJSON(r);
            if(data.aprovePassword == "true")
                {
                    goodPassword = true;
                }
            else
                {
                    goodPassword = false;
                }
            successCallback(goodPassword);
       }});
  }

问题在于ajax请求是异步的,因此函数在启动jQuery.ajax调用后立即返回,此时goodPassword仍然未定义

相反,您需要这样做:

function foo(callback) {
    var goodPassword;

    jQuery.ajax({
     data: "action=Potato",
     url: 'servletPotato',
     timeout: 2000,
     error: function() {
        console.log("Failed to send ajax");
     },
     success: function(r) {
        var data = jQuery.parseJSON(r);

        if(data.aprovePassword == "true") {
                goodPassword = true;
        } else {
                goodPassword = false;
        }

        callback(goodPassword);
   }});
}
foo(function(goodPassword) {
    console.log('goodPassword is ' + goodPassword);
});
然后,您可以这样调用函数:

function foo(callback) {
    var goodPassword;

    jQuery.ajax({
     data: "action=Potato",
     url: 'servletPotato',
     timeout: 2000,
     error: function() {
        console.log("Failed to send ajax");
     },
     success: function(r) {
        var data = jQuery.parseJSON(r);

        if(data.aprovePassword == "true") {
                goodPassword = true;
        } else {
                goodPassword = false;
        }

        callback(goodPassword);
   }});
}
foo(function(goodPassword) {
    console.log('goodPassword is ' + goodPassword);
});

您不能检查返回值,因为ajax调用发生在函数返回之后

要执行两个操作,一个是成功,一个是失败,您需要执行以下操作:-

var foo = function(goodCallback, badCallback){
  jQuery.ajax({
    data: "action=Potato",
    url: 'servletPotato',
    timeout: 2000,
    error: function() {
      console.log("Failed to send ajax");
    },
    success: function(r) {
      var data = jQuery.parseJSON(r);
      if(data.aprovePassword == "true")
      {
        goodCallback();
      }
      else
      {
        badCallback();
      }
    }
  });
};

foo(
  function() {
    console.log('dude good password');
  },
  function() {
    console.log('bad password');
  }
);

或者只有一个回调函数使用goodpassword的布尔值…

因为javascript是单线程的,所以无论请求需要多长时间,foo都会在调用回调之前返回。@JonasH确定吗?由于它是单线程的,如果请求完成得足够快,它应该在函数e之前触发事件除了在jQuery中,我们还不知道场景后面会发生什么。在JS中,函数从不被抢占。XHR完成事件将被简单地添加到等待当前代码完成的事件队列中。jQuery不改变这一点,只是在XHR顶部添加了一个薄的抽象层。保护用户不受浏览器不兼容的影响