javaScript返回带有ajax的函数

javaScript return Function with ajax

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
jQuery: Return data after ajax call success
jQuery AJAX: return value on success

我无法弄清楚为什么goodPassword总是返回undefined
我确信这只是一个愚蠢的错误,我将非常感谢你的回答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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调用肯定正在工作,data.aprovePassword肯定从servlet返回为"false"


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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仍未定义。

相反,你需要做这样的事情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
   }});
}

然后你会像这样调用函数:

1
2
3
foo(function(goodPassword) {
    console.log('goodPassword is ' + goodPassword);
});


在函数返回后发生ajax调用时,无法检查返回值。

要在成功和失败时执行两个操作,您需要执行以下操作: -

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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');
  }
);

或只有1个回调函数采用goodpassword的布尔值...