Javascript 确保两个处理程序按特定顺序完成
如果我有两个处理程序连接到同一个事件,是否有方法确保其中一个总是在另一个之前完成 就本例而言,我使用超时来模拟一个长操作。但我可以要这样的东西吗:Javascript 确保两个处理程序按特定顺序完成,javascript,jquery,jquery-deferred,Javascript,Jquery,Jquery Deferred,如果我有两个处理程序连接到同一个事件,是否有方法确保其中一个总是在另一个之前完成 就本例而言,我使用超时来模拟一个长操作。但我可以要这样的东西吗: var change_label = function () { var option = $(".selected_option a").text(); $("li:first span").text(option); }; $("#container").on("click", "li", function ()
var change_label = function () {
var option = $(".selected_option a").text();
$("li:first span").text(option);
};
$("#container").on("click", "li", function () {
var self = $(this);
var t = setTimeout(function () {
$(".sel").children("li").removeClass("selected_option");
self.addClass("selected_option");
}, 1000);
});
$("#container").on("click", "li", function () {
change_label();
});
并且确保在第一个处理程序应用该类之前,文本不会被第二个处理程序更改
以下是一种您可能会感兴趣的方法 jQuery的实用程序允许您进行一些“松散耦合”。换句话说,您可以让setTimeout函数刺激一个动作或一组动作,而不知道这些动作是什么;它们可以在代码的其他地方指定,唯一的要求是相同的
回调
队列在两个代码块的范围内
这实际上是一种“发布/订阅”模式,尽管我们在这里使用它来做一些事情,而不是发布和订阅
var cb = $.Callbacks('unique');
$("#container").on("click", "li", function() {
var self = $(this);
var t = setTimeout(function() {
$(".sel").children("li").removeClass("selected_option");
self.addClass("selected_option");
cb.fire(self.find("a").text());//<<<<<< stimulate any functions currently in the callbacks list cb, and pass the required text to them.
}, 1000);
});
var change_label = function(txt) {
$("li:first span").text(txt);
};
var log_it = function(txt) {
console.log('Text changed to: ' + txt);
};
var alert_it = function(txt) {
alert('Text changed to: ' + txt);
};
cb.add(change_label);
//cb.add(log_it);
//cb.add(alert_it);
var cb=$.Callbacks('unique');
$(“#容器”)。在(“单击”、“li”,函数()上){
var self=$(这是);
var t=setTimeout(函数(){
$(“.sel”).children(“li”).removeClass(“选定的_选项”);
self.addClass(“选定的_选项”);
cb.fire(self.find(“a”).text();//下面是一种您可能会感兴趣的方法
jQuery的实用程序允许您执行一些“松散耦合”换句话说,您可以让setTimeout函数刺激一个或一组操作,而不知道这些操作是什么;它们可以在代码中的其他地方指定,唯一的要求是相同的回调
队列在两个代码块的范围内
这实际上是一种“发布/订阅”模式,尽管我们在这里使用它来做一些事情,而不是发布和订阅
var cb = $.Callbacks('unique');
$("#container").on("click", "li", function() {
var self = $(this);
var t = setTimeout(function() {
$(".sel").children("li").removeClass("selected_option");
self.addClass("selected_option");
cb.fire(self.find("a").text());//<<<<<< stimulate any functions currently in the callbacks list cb, and pass the required text to them.
}, 1000);
});
var change_label = function(txt) {
$("li:first span").text(txt);
};
var log_it = function(txt) {
console.log('Text changed to: ' + txt);
};
var alert_it = function(txt) {
alert('Text changed to: ' + txt);
};
cb.add(change_label);
//cb.add(log_it);
//cb.add(alert_it);
var cb=$.Callbacks('unique');
$(“#容器”)。在(“单击”、“li”,函数()上){
var self=$(这是);
var t=setTimeout(函数(){
$(“.sel”).children(“li”).removeClass(“选定的_选项”);
self.addClass(“选定的_选项”);
cb.fire(self.find(“a”).text());//强制执行命令的最佳方法是编写代码以保证它。在您的情况下,这意味着只添加一个处理程序,并让该处理程序调用change_label()
在适当的时候。但有些事情告诉我,你会告诉我,这并不完全代表实际问题。@CrazyTrain是的……我完全同意。但类似的方法很有效,所以在我有时间重新编写之前,我可能会这样做。你还有其他更微妙的想法吗?非常感谢。是的,你可以这样使用轮询,但这应该是最后的手段。如果您基本上希望在第一个处理程序工作时禁用第二个处理程序,那么您可以将事件委派更改为基于类。第一个将基于始终存在的类,但第二个基于在第一个处理程序启动时被删除的类,在f第一个结束。@CrazyTrain是的,这更好。我会在过渡期间尝试。谢谢,CT!强制执行命令的最好方法是编写代码以保证它。在您的情况下,这意味着只添加一个处理程序,并让该处理程序调用change\u label()
在适当的时候。但有些事情告诉我,你会告诉我,这并不完全代表实际问题。@CrazyTrain是的……我完全同意。但类似的方法很有效,所以在我有时间重新编写之前,我可能会这样做。你还有其他更微妙的想法吗?非常感谢。是的,你可以这样使用轮询,但这应该是最后的手段。如果您基本上希望在第一个处理程序工作时禁用第二个处理程序,那么您可以将事件委派更改为基于类。第一个将基于始终存在的类,但第二个基于在第一个处理程序启动时被删除的类,在f第一个一结束。@CrazyTrain是的,那更好。我会在中间试试。谢谢,CT!