【发布时间】:2015-06-04 11:15:29
【问题描述】:
我的代码中有几行需要以正确的顺序运行。这些行包括:
Ajax 调用、动画和播放音频
我知道这些问题: Call a function after previous function is complete
Wait until all jQuery Ajax requests are done?
How do I make jQuery wait for an Ajax call to finish before it returns?
我只需要一种可以添加到函数定义中的方法,以便在完成任何其他操作之前先完成该函数。我的主要问题是这个 function1.done(function2) 或回调结构,因为我有很多这样的,所以我想控制这些行的执行顺序,只是用它们在代码中的顺序。有没有办法做到这一点?
$.get(lang1_txt_path, function(data) {
src_txt = data;
}, 'text').done(function() {
$.get(lang2_txt_path, function(data) {
trg_txt = data;
}, 'text').done(function() {
$.get(lang2_os_txt_path, function(data) {
trg_txt_os = data;
}, 'text').done(function() { //something
})
})
});
这些是动画:
$("#success_div").delay(1000).show(1000);
$("#success_div").delay(500).hide(500);
$("#success_div").fadeOut('slow', function() {
//something else
});
这是音频:
function play_audio(audio_path,audio_type){
audio = document.getElementById("audio_"+audio_type);audio.src =audio_path;audio.play();
}
play_audio(audio_path1,'general')
played_2nd_file=false;
$("#audio_player").bind("ended", function(){
if (played_2nd_file==false){
audio_path2="audio/"+lang2+'.'+trg_audio2
play_audio(audio_path2,'general')
console.log(audio_path2)
played_2nd_file=true;
}
});
因此,您可以看到,让每一个都等到前一个完成是很麻烦的。也许有一些关于如何组织它们和包含回调的良好编程实践,但它是如此复杂,因为代码变化非常快,所以唯一的方法是确保函数在它们内部以相同的顺序实现代码,以便将其包含在每个函数的定义中。理想情况下,我想要这样的东西:
ajax_load_file(file_path1)
ajax_load_file(file_path2)
ajax_load_file(file_path3)
play_success_animation()
play_success_audio()
play_transition_audio()
play_transition animation()
非常感谢!
【问题讨论】:
-
将你自己的 promise 添加到
ajax_load_file、play_success_animation、play_success_audio等,然后你可以简单地将它们链接起来。 -
1) 我想避免链接 2) 这如何处理音频和动画?
-
1) 取决于
chaining的含义。我只是指通过done或then在promise 上的顺序执行。 2)您只需要确定播放的结束(音频或动画) - 最坏情况下使用计时器,但动画队列通过对元素的promise()调用提供。 -
听起来不错,如果在这里找不到更简单的东西,我可能会这样做:)
-
它们是更简单的选项...添加了以下每种类型的示例。 :)
标签: javascript jquery