Tôi khá mới đối với JavaScript và tôi đang làm việc trong nút yêu cầu hiểu rõ về lập trình async và thiết kế gọi lại. Tôi đã thấy rằng việc sử dụng các hàm được nhúng rất dễ thực hiện ngay cả khi các cuộc gọi lại của bạn có nhiều cấp độ sâu. Cuộc gọi lại được nhúng của bạn chỉ kết thúc là đóng cửa.Cách triển khai chức năng gọi lại có thể sử dụng
Tuy nhiên, khi bạn có nhiều lớp gọi lại trong đó nhiều cuộc gọi lại giống nhau trên các tuyến thực thi, bạn sẽ kết thúc viết lại nhiều mã gọi lại nhiều lần trong các chuỗi gọi lại riêng biệt. Ví dụ, nếu các định nghĩa mycb1 và mycb2 bên dưới được di chuyển ra ngoài A, chúng không còn có quyền truy cập ngầm định vào các biến của A và do đó, không còn hoạt động như các bao đóng nữa.
Ví dụ với định nghĩa được nhúng khi chúng hoạt động như các bao đóng.
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();
Tôi muốn làm như sau nhưng có thể thay đổi phạm vi biến cho các chức năng mycb1 và mycb2 để họ có thể được sử dụng như đóng cửa từ nơi nào chúng được gọi. Ví dụ:
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);
}
tôi biết rằng tôi có thể thực hiện một thiết kế mà một trong hai bộ biến ở mức mod để họ có thể truy cập vào các chức năng mức mod. Tuy nhiên, điều này dường như phần nào gây ô nhiễm phạm vi mod với biến mà chỉ có thể được sử dụng bởi một vài phương thức của nó. Tôi cũng biết rằng tôi có thể chuyển vào các biến để làm cho chúng có thể truy cập được vào các cuộc gọi lại khi chúng được thực hiện. Tuy nhiên, nếu tôi hiểu JS và callback hoạt động như thế nào, tôi sẽ phải chuyển nó cho fooX và sau đó foo chuyển chúng cho callbacks. Điều đó dường như không phải là một kế hoạch tốt. Phạm vi có thể thay đổi của một hàm được thay đổi để nó hoạt động như một đóng cửa từ điểm thực thi của nó chứ không phải là điểm định nghĩa của nó? Nếu không, cách tốt nhất để mô đun hóa mã gọi lại của bạn để nó có thể được tái sử dụng là gì?
bạn có thể sử dụng hàm Function.bind() để đánh giá các giá trị đã biết vào các cuộc gọi lại có tên trong thời gian chạy. đó là về gần như "đóng cửa từ điểm thực hiện của nó" như nó được, nếu tôi hiểu bạn một cách chính xác. – dandavis
bạn cũng có thể sử dụng lời hứa để duy trì trạng thái mà không đóng quá đông đúc mô-đun – dandavis
Lời khuyên tuyệt vời. Cảm ơn bạn. – rss181919