Javascript JQuery when.done如何工作
我真的很难理解when…done jquery事件是如何工作的。下面是我创建的一个JSFIDLE,它显示了正在发生的事情。我有两个javascript函数,Main和submin。我希望在结果屏幕上看到的事件顺序如下: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(); }
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”语句。这是在您的情况下执行的方式:
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”下面的所有语句都不会等待,并且会立即触发。再次感谢!!没问题。很高兴我能帮忙:)