同一函数的回调函数

5
我希望能多次调用一个函数,并在每次调用时提供不同的输入,但我想确保下一次函数调用在前一个调用完成后触发。
例如:
func(1,2);
func(9,3);
func(6,4);
func(5,6);

我曾经看到过像这样编写回调函数的代码;

function1(someVariable, function() {
          function2(someOtherVariable);
        });

但这仅适用于调用第二个函数,我尝试链接这些函数,但这只允许我运行一组固定的函数。

有没有办法将某种回调应用于同一个函数?

注意:该函数仅添加一个类。

func(x, y){
   $("#block").addClass("class");
    setTimeout(function(){ 
         $("#block").removeClass("class");
     },1000);
};

“我想要调用一个函数多次,并在每次调用时提供不同的输入,但是我希望确保下一次函数调用在前一个完成后触发。” => 这正是您展示的前4行代码所做的事情 => 它们使用不同的参数执行相同的函数,并且它们按顺序执行 => 下一个调用在前一个完成之前不会被执行。 - Darin Dimitrov
我已经添加了一个示例函数,参数可以忽略。 - Lunar
https://dev59.com/zHRB5IYBdhLWcg3w4a8o - sabithpocker
是的,我可以修改它,我只想让它们按顺序工作。 - Lunar
在这种情况下,从setTimeout内部调用回调函数,这样第二个函数将在1000ms后调用setTimeout并删除类。 - sabithpocker
显示剩余4条评论
3个回答

4
function func(x,y,callback) {
    console.log(x,y);
   $("#block").addClass("class");
    setTimeout(function(){ 
         $("#block").removeClass("class");
         callback();
     },1000);
};

var params = [
    [1,2],
    [9,3],
    [6,4],
    [5,6]
], i = 0;

function fn() {
    if( params[i] ) {
        func( params[i][0], params[i++][1], fn );
    }
}

fn();

只要还有参数,就会继续运行。

示例 : http://jsfiddle.net/sabithpocker/dQX6s/


2
你可以通过添加一个额外的参数来修改 func 函数,该参数将表示在函数成功执行时执行的回调:
func(x, y, finished) {
    $("#block").addClass("class");
    window.setTimeout(function() {
        $("#block").removeClass("class");
        finished();
    }, 1000);
};

然后链接调用:

func(1, 2, function() {
    func(9, 3, function() {
        func(6, 4, function() {
            func(5, 6, function() {
                alert('all done');
            });
        });
    });
});

是的,这就是我正在尝试的内容,它可以正常工作。如果您不知道将调用该函数多少次,有没有办法实现这一点? - Lunar

0

我认为我们应该使用jQuery中可用的Promise模式来解决这个问题,它允许在不需要复杂语法的情况下链接回调函数。请参考下面的伪代码。

function func(value1, value2) {
            var deffered = jQuery.Deferred();
            alert(value1);
            deffered.resolve();
            return deffered;
        }

jQuery.when(func(1, 2)).then(func(2, 3)).then(func(3,4));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接