如何避免回调链?

ezm*_*use 21 javascript jquery callback

我需要严格按顺序调用一堆函数.下一个函数等到前一个函数完成之前,这一点也非常重要.

现在我正在使用链式回调:

callMe1(function(){
    callMe2(function(){
        callMe3(function(){

            callMeFinal();

        });
    });
});
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎有点难看.

对于不同方法的任何建议?

Fel*_*ing 32

如果您使用jQuery,那么您可以使用queue链接函数.

$(document)
  .queue(callMe1)
  .queue(callMe2);
Run Code Online (Sandbox Code Playgroud)

这里callMeX的格式应为:

function callMeX(next) {
    // do stuff
    next();
}
Run Code Online (Sandbox Code Playgroud)

  • 队列很棒...一个建议,而不是绑定到`$(document)`绑定到`$({})` - 这样队列中的函数可以使用`this`来引用同一个共享对象. (20认同)

The*_*ter 6

您可以实现"堆栈"系统:

var calls = [];

function executeNext(next) {
    if(calls.length == 0) return;
    var fnc = calls.pop();
    fnc();
    if(next) {
        executeNext(true);
    }
}

/*To call method chain synchronously*/
calls.push(callMe3);
calls.push(callMe2);
calls.push(callMe1);
executeNext(true);

/*To call method chain asynchronously*/
calls.push(callMe3);
calls.push(function(){
    callMe2();
    executeNext(false);
});
calls.push(function(){
    callMe1();
    executeNext(false);
});
Run Code Online (Sandbox Code Playgroud)