Funkcijos iškvietimas po to, kai baigiama ankstesnė funkcija

Turiu tokį "JavaScript" kodą:

$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable);
        function2(someOtherVariable);
    }
    else {
        doThis(someVariable);
    }
});

Kaip užtikrinti, kad funkcija2 būtų iškviečiama tik po to, kai baigsis funkcija1?

Sprendimas

Nurodykite anoniminį grįžtamąjį skambutį ir padarykite, kad funkcija1 jį priimtų:

$('a.button').click(function(){
    if (condition == 'true'){
        function1(someVariable, function() {
          function2(someOtherVariable);
        });
    }
    else {
        doThis(someVariable);
    }
});

function function1(param, callback) {
  ...do stuff
  callback();
} 
Komentarai (13)

Jei naudojate "jQuery 1.5", galite naudoti naująjį "Deferreds" modelį:

$('a.button').click(function(){
    if(condition == 'true'){
        $.when(function1()).then(function2());
    }
    else {
        doThis(someVariable);
    }
});

Redaguoti: atnaujinta tinklaraščio nuoroda:

Rebecca Murphy apie tai puikiai parašė čia: http://rmurphey.com/blog/2010/12/25/deferreds-coming-to-jquery/

Komentarai (10)

Tai priklauso nuo to, ką atlieka funkcija1.

Jei funkcija1 atlieka paprastą sinchroninį javascript, pavyzdžiui, atnaujina div reikšmę ar panašiai, funkcija2 bus paleista po to, kai funkcija1 bus baigta.

Jei funkcija1 atlieka asinchroninį skambutį, pavyzdžiui, AJAX skambutį, jums reikės sukurti "atgalinio skambučio" metodą (dauguma ajax API' turi atgalinio skambučio funkcijos parametrą). Tada atgaliniame skambučio metode iškvieskite funkciją2. pvz:

function1()
{
  new AjaxCall(ajaxOptions, MyCallback);
}

function MyCallback(result)
{
  function2(result);
}
Komentarai (0)