2009-11-21 6 views
5

Czy istnieje sposób, aby uruchomić funkcję po zakończeniu kolejne funkcje? Na przykład:jquery funkcje synchroniczne

doSomething(); 
doSomethingElse(); 

Chcę tylko doSomethingElse(), aby uruchomić po zakończeniu doSomething. czy to możliwe?

+2

Nie co zaksięgowany już robić to, co chcesz? Czego tu mi brakuje? –

+1

+1, aby zrównoważyć -1. To pytanie jest tak samo ważne jak każde inne. – echo

+1

Czy masz szansę podać nam więcej kodu lub powiedzieć, co próbujesz zrobić? – Nosredna

Odpowiedz

7

Jeśli funkcja doSomething() robi coś asynchronicznie (takie jak złożenie żądania Ajax), a następnie będziemy chcieli, aby doSomethingElse() wywołania zwrotnego dla tej asynchronicznym żądanie, zamiast go wykonać natychmiast po doSomething() zwrotów.

+0

Składam zapytanie ajaxowe, więc wygląda to jak prawidłowe rozwiązanie, aby umieścić je w wywołaniu zwrotnym, ale próbowałem to zrobić poza wywołaniem zwrotnym. – ngreenwood6

-1

Nie ma mowy, aby egzekwować to wyraźnie per se, ale chodzi o to, aby mieć doSomething() zwraca wartość doSomethingElse() przyjmuje jako parametr:

retval = doSomething(); 
    doSomethingElse(retval); 

ten sposób przynajmniej zapobiec kogoś z Wywołanie doSomethingElse() bez podania argumentu, którego potrzebuje ... oczywiście, czy otrzymają ten argument od wywołania doSomething() to inna kwestia. Ale to jest początek.

Idea podnoszone z Kodeksem zakończona.

+5

Nie widzę, jak to rozwiązuje cokolwiek. Jedynym sposobem, aby pytanie miało sens, jest to, że doSomething() robi coś asynchronicznego. Powracanie i przekazywanie wartości nie ma wpływu na czas wykonania pracy. – Nosredna

6

Właściwie można robić, co chcesz z jQuery (przynajmniej w pewnym sensie). Można to uznać za trochę hacky, ale działa bezbłędnie.

Wystarczy zawierać element na stronie, która nie używać do niczego innego. na przykład pusty gdzieś.

<div id="syncFnHolder"></div> 

A potem to JS ze swoimi funkcjami + funkcja runMe napisany przeze mnie.

function doSomething() { alert("First"); } 
function doSomethingElse() { alert("Second"); } 
function doSomethingElseThree() { alert("Third"); } 

function runMe(fn, selec) { 
    return function() { 
     fn(); 
     setTimeout(function() { 
      $(selec).dequeue("syncFnQueue"); 
     }, 1000); 
    } 
}; 

var selector = "#syncFnHolder"; 
//add three functions to a queue 
$(selector).queue("syncFnQueue", runMe(doSomething, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElse, selector)); 
$(selector).queue("syncFnQueue", runMe(doSomethingElseThree, selector)); 
//start first function in queue (FIFO) others are triggered automatically 
$(selector).dequeue("syncFnQueue"); 

To wygeneruje trzy alerty o odległości 1 s między nimi, mówiąc "Pierwszy", "Drugi", "Trzeci".

Jeśli nie chcesz opóźnienia, usuń setTimeout i po prostu zostaw połączenie na $(selec).dequeue("syncFnQueue");.

Jeśli funkcje potrzebne parametry np doSomething(x,y,z) Musisz zaadaptować funkcję runMe, aby była lepsza częściowo i aby skonstruować zwróconą funkcję w inny sposób. Sprawdź tutaj lub opublikuj nowe pytanie.

javascript partial

+1

bardzo interesujące – gpilotino

+2

Dlaczego po prostu nie kolejkowania i odstąpienia w obiekcie JS. Wydaje się bezcelowe, aby umieścić go w dummy DOM. – nickytonline

+0

? Jak mogę to zrobić w jQuery? Zgaduję, że nie mogę śledzić tego, co masz na myśli o tej porze dnia (02:45). – jitter

2

Pytanie jest nieco niejasne.

Jeśli funkcje mają asynchronicznych bity do nich, a następnie użyć wywołania zwrotne. Po to są.

Jeśli jednak chcesz wykonywać programowanie aspektowe w JavaScript, spójrz na jQuery-aop.

3

Możesz to zrobić ....

function doSomething(callback) { 
    // code for do some thing 
    // now fire off the callback 
    if (typeof callback === 'function') { 
     callback(); 
    } 
} 

function doSomethingElse() { 
} 

doSomething(doSomethingElse);