Javascript 在一个函数中包含的所有函数的末尾进行回调

Javascript 在一个函数中包含的所有函数的末尾进行回调,javascript,jquery,callback,Javascript,Jquery,Callback,我发现自己在回拨问题上被困了好几天,找不到任何方便的解决办法。问题是: 我有一些jQuery看起来像这样 $(document).ready(function(){ masterFunction_A(); masterFunction_B(); }); function masterFunction_A() { littleFunction_1(); littleFunction_2(); littleFunction_3(); littleFu

我发现自己在回拨问题上被困了好几天,找不到任何方便的解决办法。问题是:

我有一些jQuery看起来像这样

$(document).ready(function(){
    masterFunction_A();
    masterFunction_B();
});

function masterFunction_A() {
    littleFunction_1();
    littleFunction_2();
    littleFunction_3();
    littleFunction_4();
    // etc...
}
function masterFunction_B() {
    // do stuff
}
我想在所有littleFunction()完成后开始执行masterFunction_B()。当我尝试将masterFunction_B()设置为masterFunction_a()的回调时,它似乎是在masterFunction_a()启动所有littleFunctions()时启动的,但不是在littleFunctions()结束时启动的

我试图:

  • 设置一个计时器,并在该计时器结束时启动masterFunction_B(),但。。。这不是一个正确的方法
  • 在所有LittleFunction中设置回调,并设置一个计数计数器,直到调用正确数量的回调,但我认为有一种更好、更干净的方法来获得我想要的
你能帮忙吗

非常感谢

--编辑--

这是主函数_A()的内容,实际上称为loadContents():

函数loadContents(){
$.getJSON('data/data.json',函数(数据){
对于(变量i=0;i”);
}   
});
}
});
}

看看jQuery延迟特性。我想这正是你需要的

首先,为每个littleFunction创建一个延迟函数:

dfd1 = $.Deferred();
dfd2 = $.Deferred();
dfd3 = $.Deferred();
dfd4 = $.Deferred();
在每个littleFunction中,最后解决延迟的问题:

function littleFunction1() {
  ...
  dfd1.resolve();
}

...
解决所有延迟后,开始执行主功能:

$.when(dfd1, dfd2, dfd3, dfd4).then(masterFunction_B);

使用jQueryAJAX函数中内置的jQueryDeferred,您可以使所有这些都像这样工作

首先,使每个
littleFunction_x()
代码如下所示:

function littleFunction_1() {
     var d = $.getJSON(...)
     // other code
     return d;
}
$(document).ready(function(){
    masterFunction_A().done(masterFunction_B);
});

function masterFunction_A() {
    return $.when(littleFunction_1(), 
           littleFunction_2(),
           littleFunction_3(),
           littleFunction_4()
    );
}
然后,您可以执行以下操作:

$(document).ready(function(){
    $.when(masterFunction_A()).done(masterFunction_B);
});

function masterFunction_A() {
    var d = $.Deferred();
    $.when(littleFunction_1(), 
           littleFunction_2(),
           littleFunction_3(),
           littleFunction_4()
    ).done(function() {
        d.resolve();
    });
    return d;
}

在仔细考虑之后,我认为您还可以做一个稍微干净的版本,如下所示:

function littleFunction_1() {
     var d = $.getJSON(...)
     // other code
     return d;
}
$(document).ready(function(){
    masterFunction_A().done(masterFunction_B);
});

function masterFunction_A() {
    return $.when(littleFunction_1(), 
           littleFunction_2(),
           littleFunction_3(),
           littleFunction_4()
    );
}

您的函数是否是异步的(它们是否执行Ajax)?如果是这样,你需要一个完全不同的策略。如果没有一个是异步的,那么它的工作方式应该很好,因为javascript是单线程的,不会同时运行两个线程。如果
littleFunction\u X()
是异步的,那么您必须使用通知来通知它们何时完成,以便启动
masterFunction\u B()
,我们需要了解更多关于它们是什么的信息,以便确切地知道如何向您提供建议。是的,实际上第一个是loadContents(),并调用$.getJSON()。第二个称为setDimensions(),为加载loadContents()的数据设置尺寸和样式。。不好吗d请显示
littleFunction_1()
的实际代码。您必须跟踪其中的ajax调用何时完成。如果您从每个
littleFunction_X()
返回延迟的ajax,然后在所有这些函数上使用
$,那么您可以非常轻松地执行您想要的操作。when()
,但我们需要查看您的ajax代码,以提供具体建议。我用masterFunction_A()的内容编辑了这篇文章,我已经添加了一个答案,它在每个
littleFunction\u X()
函数中使用从
$.getJSON()
返回的延迟对象,在它们全部完成时获取通知,这样您就可以运行
masterFunction\u B()
。在
littleFunction\u X
中有ajax调用。他们已经有了自己的延期,不需要创建单独的延期。好的,我现在正在尝试,我会让你知道的。谢谢