Jestem dość nowy w JavaScript i pracuję w węźle, który wymaga dobrego zrozumienia programowania asynchronicznego i projektowania wywołań zwrotnych. Odkryłem, że korzystanie z funkcji osadzonych jest bardzo łatwe, nawet gdy połączenia zwrotne mają wiele poziomów. Wbudowane callbacki kończą się zamknięciami.Jak zaimplementować funkcje wywołania zwrotnego wielokrotnego użytku
Jednak, gdy masz kilka warstw wywołań zwrotnych, w których wiele wywołań zwrotnych jest podobnych w różnych trasach wykonania, możesz wielokrotnie przepisywać wiele kodów zwrotnych w osobnych łańcuchach wywołań zwrotnych. Na przykład, jeśli definicje mycb1 i mykb2 poniżej zostaną przeniesione poza A, nie będą one już miały niejawnego dostępu do zmiennych A, a zatem przestaną funkcjonować jako zamknięcia.
Przykład z definicjami osadzonymi, w których działają one jako zamknięcia.
mod.A=function(){
var mycb1=function(err){
if (!err){
var mycb2=function(err){
cb(err);
};
mod.foo2(args,mycb2);
}
else{cb(err);}
};
mod.foo1(args,mycb1);
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
};
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
//execute
mod.A();
Chcę wykonać następujące czynności, ale można zmienić zakres zmienny funkcji mycb1 i mycb2 więc mogą być stosowane jako zamknięcia skąd kiedykolwiek są one nazywane. Na przykład:
var mycb2=function(err){
...
cb(err);
};
var mycb1=function(err){
if (!err){
mod.foo2(args,mycb2); //but have it act like a closure to mycb1
}
else{cb(err);}
};
mod.A=function(){
...
mod.foo1(args,mycb1); //but have it act like a closure to A
}
mod.foo1 = function(args,cb){
//do some work
cb(err);
}
mod.foo2 = function(args,cb){
//do some work
cb(err);
}
wiem, że mogę realizować projekt, który ustawia zmienną zarówno na poziomie mod więc są one dostępne dla funkcji poziom modyfikacji. Wydaje się to jednak w pewien sposób zanieczyszczać zakres modowy zmienną, z której mogą korzystać tylko niektóre z jego metod. Wiem również, że mogę przekazywać zmienne, aby były one dostępne dla wywołań zwrotnych, gdy są wykonywane. Jednakże, jeśli rozumiem, jak działają JS i wywołania zwrotne, będę musiał je przekazać do fooX, a następnie foo przekazać je do wywołań zwrotnych. To też nie wygląda na dobry plan. Czy zmienny zakres funkcji może zostać zmieniony, aby działał jak zamknięcie z punktu realizacji, a nie z punktu widzenia definicji? Jeśli nie, jaki jest najlepszy sposób na modularyzację kodu wywołania zwrotnego, aby można go było ponownie wykorzystać?
można użyć funkcji Function.bind() do cementowania znanych wartości w nazwane wywołania zwrotne w czasie wykonywania. to jest prawie tak blisko "zamknięcia z punktu jego realizacji", jak to się stanie, jeśli dobrze cię zrozumiem. – dandavis
można również używać obietnic do utrzymywania stanu bez zamykania modułów nadmiernie przepełnionych. – dandavis
Doskonała porada. Dziękuję Ci. – rss181919