在ajax / jquery调用中使用success函数之外的变量

时间:2011-05-09 11:04:18

标签: javascript jquery ajax

我有以下代码

var test;
     $.ajax({
        type: "GET",
        url: "../views/person/controller.php?actor=person&action=checkAge",
        data: "age=" + value,
        success: function(msg){
            console.log(msg);
            test = msg; 
        },
    });
    Validate.fail(test);

现在test var应该像控制台所说的那样给出false。 但是测试变量给了我不明确的原因?

5 个答案:

答案 0 :(得分:24)

 var test;  <-- (1) This code runs first  
 $.ajax({   <-- (2) Then this runs  
    type: "GET",
    url: "../views/person/controller.php?actor=person&action=checkAge",
    data: "age=" + value,
    success: function(msg){
        console.log(msg); <-- (4) Finally this is run. IF your request is a success 
        test = msg; 
    },
 });
 Validate.fail(test); <-- (3) This runs third  

查看代码运行的顺序。您的变量在此时根本不可用,因为它在通过回调触发代码时运行

答案 1 :(得分:20)

可能是因为Validate.fail(test)在异步调用之后立即发生。请记住它是ASYNCHRONOUS,这意味着它与您页面上运行的javascript并行执行。

答案 2 :(得分:7)

enter code here var test;
 $.ajax({
    type: "GET",
    async: false,
    url: "../views/person/controller.php?actor=person&action=checkAge",
    data: "age=" + value,
    success: function(msg){
        console.log(msg);
        test = msg; 
    },
});
Validate.fail(test);

//使你的ajax函数同步,设置json参数&#34; async:false&#34;,所以javascript必须等到测试被分配一个值。

答案 3 :(得分:3)

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
var xm;

  $("#txt").ajaxComplete(function(){
    $('#txt').html(xm);
  });

  $("button").click(function(){

    $.ajax({
      url: 'DBresult_load.php',
      dataType: 'html',
      data: { },                 //you can pass values here
      success: function(result) {xm =result;}
    });
  });


});
</script>
</head>
<body>

<div id="txt"><h2>Let AJAX change this text</h2></div>
<button>Change Content</button>
</body>
</html>

以下是从Ajax请求向值传递值的解决方案。希望这会有所帮助。

答案 4 :(得分:-1)

当您声明它时,在术语“test”之前删除“var”会发生什么?

我不确定如何使用jQuery处理回调函数,因为它包含在其他几个扩展方法中。但我之所以说在test变量的声明中保留var是的原因是var指定测试相对于范围。如果以某种方式处理回调,则可能会失去定义test的范围。您可能希望删除var赋值并将其保留为全局变量。也许这会让它变得可见?

编辑::在异步请求之后没有意识到您在函数调用中引用了该术语 - 我建议在回调中包含最后一个语句。

:)