Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JQuery when.done如何工作_Javascript_Jquery - Fatal编程技术网

Javascript JQuery when.done如何工作

Javascript JQuery when.done如何工作,javascript,jquery,Javascript,Jquery,我真的很难理解when…done jquery事件是如何工作的。下面是我创建的一个JSFIDLE,它显示了正在发生的事情。我有两个javascript函数,Main和submin。我希望在结果屏幕上看到的事件顺序如下: Main Begin SubMain Begin SubMain End Main End 相反,我看到: Main Begin Main End SubMain Begin SubMain End 那么我做错了什么( $(文档).ready(函数(){ Main(); }

我真的很难理解when…done jquery事件是如何工作的。下面是我创建的一个JSFIDLE,它显示了正在发生的事情。我有两个javascript函数,Main和submin。我希望在结果屏幕上看到的事件顺序如下:

Main Begin
SubMain Begin
SubMain End
Main End
相反,我看到:

Main Begin
Main End
SubMain Begin
SubMain End
那么我做错了什么(

$(文档).ready(函数(){
Main();
});
函数Main(){
$('#ajax').append(“主开始”).append(['
'); var jsonData={ “text1”:“textData1”, “text2”:“textData2” }; 美元。什么时候( $.ajax({ 键入:“POST”, 数据类型:“json”, url:“/echo/json/”, 数据:{ json:json.stringify(jsonData) }, 成功:功能(数据){ //做事 var selected=“selected”; 如果(已选定。长度>0) $.when(submin()).done(function(){}); } }) ).done(函数(){}); $('#ajax').append(“主端”).append(['
'); } 函数子{ $('#ajax').append(“submin begin”).append(['
'); //做事 $('#ajax').append(“submin end”).append(['
'); }
AJAX是一个异步函数。您可以在AJAX中将async设置为false,但它已被弃用。

AJAX是一个异步函数。您可以在AJAX中将async设置为false,但它已被弃用。

如$中的定义所述。当

提供一种基于零或多个回调函数执行回调函数的方法 对象,通常是表示异步事件的延迟对象

代码中
when
中的异步事件是
$.ajax
$.when
中的ajax成功回调函数。 因此,只有在解决这两个问题后才会调用$.done

代码中的问题在于“Main end”语句。这是在您的情况下执行的方式:

  • “Main Begin”首先附加到“#ajax”之后
  • ajax调用发生在您提到的异步url上
  • 执行继续,因为ajax是异步的,即执行上下文不会等待ajax调用完成。由于进行ajax调用后的下一行是“Main end”语句,因此它会追加到下一行
  • 成功解析ajax调用后,它将调用附加“submin begin”和“submin end”的submin方法
  • 因此,要使代码按预期工作,请将“Main end”语句移动到
    done
    回调函数中,以便在
    中的所有延迟对象解析后调用它:

    $.when(
        $.ajax(....)
    ).done(function() {
     $('#ajax').append("Main end").append(['<br/>']);
    });
    
    $。什么时候(
    $.ajax(…)
    ).done(函数(){
    $('#ajax').append(“主端”).append(['
    '); });
    如中的定义所述,约为美元。当

    提供一种基于零或多个回调函数执行回调函数的方法 对象,通常是表示异步事件的延迟对象

    代码中
    when
    中的异步事件是
    $.ajax
    $.when
    中的ajax成功回调函数。 因此,只有在解决这两个问题后才会调用$.done

    代码中的问题在于“Main end”语句。这是在您的情况下执行的方式:

  • “Main Begin”首先附加到“#ajax”之后
  • ajax调用发生在您提到的异步url上
  • 执行继续,因为ajax是异步的,即执行上下文不会等待ajax调用完成。由于进行ajax调用后的下一行是“Main end”语句,因此它会追加到下一行
  • 成功解析ajax调用后,它将调用附加“submin begin”和“submin end”的submin方法
  • 因此,要使代码按预期工作,请将“Main end”语句移动到
    done
    回调函数中,以便在
    中的所有延迟对象解析后调用它:

    $.when(
        $.ajax(....)
    ).done(function() {
     $('#ajax').append("Main end").append(['<br/>']);
    });
    
    $。什么时候(
    $.ajax(…)
    ).done(函数(){
    $('#ajax').append(“主端”).append(['
    '); });
    $('#ajax').append(“主端”).append(['
    ');
    应该移动到
    done
    回调中。jQuery有一个关于承诺/延迟对象的教程,您应该阅读:.
    $('#ajax').append(“主端”).append(['
    '));
    应该移动到
    done
    回调中。jQuery有一个关于承诺/延迟对象的教程,您应该读到:。感谢大家的输入…灯终于亮了。我想,一旦到达“when…done”事件,在完成之前不会执行任何其他操作。但是正如您所指出的,只有y done函数中的事件被延迟,“when…done”下面的所有语句都不会等待,将立即启动。再次感谢!!没问题。很高兴我能提供帮助:)感谢大家的输入…灯终于亮了。我在想,一旦完成了一个“when…done”事件,在它完成之前不会执行任何其他操作。但正如您所指出的,只有done函数中的事件被延迟,“when…done”下面的所有语句都不会等待,并且会立即触发。再次感谢!!没问题。很高兴我能帮忙:)