为什么以下异步功能工作异常?

时间:2017-01-14 12:14:49

标签: javascript jquery ajax

我已经从本网站的一些答案中了解了async函数的行为。但我仍然感到困惑。我尝试了2个jQuery语句,其中 STMT1 '与ajax调用合作',而STMT2则没有。我的意思是ajax声明无法获得所需的数据

为什么会这样? STMT1 的执行速度是否比 STMT2 快一点?

编辑:按行为,我的意思是async语句一起执行,它们是非阻塞的。所以我的两个陈述都不行?但其中一个仍在工作。为什么会这样?

$(document).ready(function(){
    var foo='types: ';
    $("button").click(function(){
        //STMT1

        // $("p").each(function(){
        //  foo=foo+$(this).text();
        // });

        //STMT2

        $("p").hide(function(){
            foo="YOLO";
        });
        $.ajax({
            url: 'api.php',
            type: 'post',
            data: 'name='+foo,
            success: function(result){
                console.log(result);
            },
            error: function(){
                console.log("Couldn't make request");
            }
         });
    });
});

2 个答案:

答案 0 :(得分:-1)

jquery动画是异步方法,hide方法的默认持续时间是400ms

来源 - http://api.jquery.com/hide/

这就是为什么你的ajax请求先行,变量foo稍后改变的原因。希望它有所帮助。

答案 1 :(得分:-2)

当jQuery以默认延迟(400毫秒)隐藏元素时,hide回调将在稍后运行,而不是立即运行。因此,在您开始以下ajax调用之前,foo尚未更改。如果您想等到更改foo以启动以下ajax调用,请将该调用置于 hide回调中。

  

我的意思是ajax声明正在获取foo的值,我认为不应该这样,因为所有3个语句都是相互执行的,因为它们是异步的? STMT1执行得足够快,以便ajax获得值吗?

不,这根本不是巧合。您的四个异步调用全部并行运行,其中只有两个是。以下是该代码中发生的事情:

  1. 您安排了ready回拨
  2. 一段时间后,ready回调被触发:
    1. 它会为foovar foo='types: ')指定一个值。
    2. 设置click处理程序
  3. 如果,请点击该元素,然后:
    1. 点击处理程序使用默认延迟
    2. 计划hide
    3. 使用foo的现有值("types: ")启动ajax调用。
    4. 大约400毫秒后,hide的回调即开始运行,将foo的值设为"YOLO"
  4. 如果您再次点击该元素,它会执行相同的操作,但此时foo的值已经是"YOLO",因此所使用的内容是什么?{0} ajax电话