在 ajax/jquery 调用的成功函数之外使用变量

IT技术 javascript jquery ajax
2021-03-11 21:00:51

我有以下代码

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 给了我未定义的为什么?

5个回答
 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  

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

- 谢谢,我的意思是在 ajax 调用之外传递变量/值的解决方案是什么,不使用异步
2021-04-24 21:00:51
那是不正确的。使用 async 不好/不好。根据用例,这是一个有效的选择。例如,如果您正在执行服务器端调用来验证一段数据,那么您应该使用 async 并且在收到结果之前不要阻止网页。
2021-05-02 21:00:51
你不能那样做。如果您正在使用 async 并且正在等待结果,那么调用的最后一部分将在 aync 块内。
2021-05-08 21:00:51
如果不使用,解决方案是什么async(+1 为您提供的解释)
2021-05-10 21:00:51
通常,您会向用户显示加载指示器并等待收到服务器响应。
2021-05-12 21:00:51

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

我很高兴您解决了这个问题,但我建议您重新考虑您的解决方案。我不能说我了解您的应用程序的方面,但同步 ajax 调用大多违背了 Ajax 的目的。干杯。
2021-05-01 21:00:51
Tnx 再给你小费。但为了这个目的,它确实是必要的。将来我会尽量避免使用此解决方案:)
2021-05-08 21:00:51
Tnx 这帮助我找到了解决方案通过对 call 属性执行 async: false
2021-05-13 21:00:51
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参数"async:false",这样javascript就得等到test被赋值了。

<!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 请求传递给变量的解决方案。希望这可以帮助。

在声明“test”一词之前删除“var”会发生什么?

我不知道回调函数是如何使用jQuery处理,因为它是一些其他的扩展方法中包裹..但我之所以说假变量超出在声明test变量是var受让人测试是相对于范围。如果您的回调以某种方式被处理,您可能会失去test定义的范围您可能希望删除var赋值并将其保留为全局变量。也许这会使它可见?

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

:)

顺便说一下,你的辩论技巧很棒
2021-04-26 21:00:51
它如何无关紧要?他说那test是未定义的......这意味着它超出了范围......并将var变量委托给当前堆栈......所以如果你删除它var并使其在堆上成为全局,那么它应该被定义......你了解变量可见性吗?;)
2021-04-28 21:00:51
我不明白你的回答。您说的正确,如果您忽略var它,它将使其成为全球性的,但这与这个问题有什么关系?这里的问题是 test 没有在Validate调用时实例化,这是因为只有在回调成功时才给它一个值。如果您在声明时实际实例化,则代码将正常工作(但验证将变得无用,因为您明确声明了它)
2021-04-30 21:00:51
糟糕的编程习惯.. 哈。
2021-05-05 21:00:51
var 将变量描述为与作用域相关的变量。
2021-05-08 21:00:51