2013-08-13 67 views
16

Có thể tôi không hiểu vòng lặp sự kiện của Node đủ tốt.gọi lại() hoặc trả về cuộc gọi lại()

Giả sử tôi có hàm foo có hàm không đồng bộ async_func. Tôi có

//1 
function foo(callback) { 
     //stuff here 
     async_func(function() { 
      //do something 
      callback(); 
     }); 
//this eventually get executed 
} 

hoặc

//2 
function foo(callback) { 
     //stuff here 
     async_func(function() { 
      //do something 
      return callback(); 
     }); 
//never executed 
} 

Trả lời

26

Trên thực tế, trong mẫu của bạn 2, //never executed sẽ thực hiện mọi lúc. Nó quay trở lại từ cuộc gọi lại, không phải từ chức năng gói.

Đôi khi người gọi thực sự mong đợi một số giá trị trả lại và hành vi có thể thay đổi dựa trên điều đó. Một lý do phổ biến khác để xem một hàm gọi lại() chỉ là một cách rõ ràng để đoản mạch hàm mà bạn đang ở. Ví dụ.

function doSomething(callback) { 
    something(function(err, data) { 
     if(err) return callback(err); 
     // Only run if no error 
    }); 
    // Always run 
} 

Mặc dù giá trị trả lại không được sử dụng, nó sử dụng trở lại để đảm bảo rằng quá trình thực thi không tiếp tục qua lỗi có điều kiện. Bạn có thể dễ dàng viết nó theo cách này có cùng tác dụng.

function doSomething(callback) { 
    something(function(err, data) { 
     if(err) { 
      callback(err); 
      return; 
     } 
     // Only run if no error 
    }); 
    // Always run 
} 
+0

Điều đó giúp lol nhiều. Cảm ơn – Colin

+0

@Timothy, câu trả lời hay nhưng '_.find' là gây hiểu nhầm và tôi khuyên bạn nên xóa nó. '_.find' là đồng bộ và không gọi lại. Phải mất một hàm lặp, sử dụng nó trong khi xử lý, nhưng sau đó vẫn trả về kết quả một cách đồng bộ. Ví dụ này sẽ chỉ gây nhầm lẫn cho mọi người. –

+0

@PeterLyons Điểm tốt. Đã xóa. –

Các vấn đề liên quan