2013-06-20 12 views
29

Mam funkcję, która robi coś takiego:Chain wielokrotny "a następnie" w jQuery.when

function do_something() { 
    // some code 

    return $.when(foo, bar, baz).then(do_something_else); 
} 

function do_something_else(_foo, _bar, _baz) { 
    // do something else 

    return /* the original inputs */; 
} 

Tak więc, gdy ktoś używa do_something, mogą również łańcuchu wywołań zwrotnych, takich jak:

do_something().then(function(_foo_2, _bar_2, _baz_2) { 
    console.log(_foo_2, _bar_2, _baz_2); 
}); 

Problem polega na tym, że nie wiem, jak obejść oryginalny powrót z do_something_else do opisanej anonimowej funkcji. Nie chcę otrzymywać listy, ale argumenty pozycyjne zamiast tego, więc "gdy foo" wstawi jakąś wartość do _fs_something_else _foo, a następnie ta sama wartość idzie do _foo_2.

Jak mogę to zrobić w JS?

Odpowiedz

54

Użyj anonimowej funkcji wewnątrz .then i podaj parametry, które chcesz przekazać. Zastępuję .then z .done, ponieważ nie potrzebujesz w tym przypadku .then.

function do_something() { 
    // some code 

    return $.when(foo, bar, baz).done(function(_foo_2, _bar_2, _baz_2){ 
     do_something_else.apply(this,_foo_2); 
    }); 
} 

. Potem w rzeczywistości tworzy nowy odroczony obiekt i wysyła go do łańcucha. Ponieważ nie zwróciłeś niczego od .then, nowy obiekt odroczony nie ma argumentów. Zobacz poniższy przykład:

$.when($.Deferred().resolve(2), $.Deferred().resolve(4)) 
.then(function(a,b) { 
    console.log(a,b); // 2,4 
    return $.Deferred().resolve(a,b,6); 
}).then(function(a,b,c) { 
    console.log(a,b,c); // 2,4,6 
}); 

Jeśli zamiast po prostu wykorzystywane .done, to działa zgodnie z oczekiwaniami.

$.when($.Deferred().resolve(2), $.Deferred().resolve(4)) 
.done(function(a,b) { 
    console.log(a,b); 
}).done(function(a,b) { 
    console.log(a,b); 
}); 

Najczęstszym zastosowaniem dla .then jest łańcuchowym Ajax wnioski:

$.ajax({...}).then(function(){ 
    return $.ajax({...}); 
}).then(function(){ 
    return $.ajax({...}); 
}).then(function(){ 
    return $.ajax({...}); 
}).then(function(){ 
    return $.ajax({...}); 
}); 

które można łatwo zrobić w pętli. Każdy .then będzie miał dostęp do zwróconych danych z poprzedniego żądania.

+0

Jaka jest różnica między .done i .then w tym przypadku? Używam [tego przykładu] (https://gist.github.com/anonymous/5823503) –

+4

'.then' utworzy nowy odroczony i doda go do łańcucha. Następna czynność wykonywana w łańcuchu, na przykład '.done' lub' .then', będzie miała dostęp tylko do tego, co zostało zwrócone z poprzedniego '.then'. –

+0

@KevinB: Czy tak właśnie zaimplementował jQuery? Smutne :(W pierwotnej propozycji nowa obietnica jest rozwiązana z oryginalnymi wynikami, jeśli żadna nie jest zwracana z wywołania zwrotnego '.then '. –

Powiązane problemy