Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 确保两个处理程序按特定顺序完成_Javascript_Jquery_Jquery Deferred - Fatal编程技术网

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!