2016-02-10 13 views
7

Tôi đang xem hướng dẫn Redux của Dan Abramov trên Egghead và anh ấy làm điều gì đó mà tôi hơi bối rối. Là một bài tập học tập, anh ta có người xem xây dựng lại sự trừu tượng createStore. Một phương thức createStore cung cấp là subscribe, cho phép người nghe lắng nghe những thay đổi của cửa hàng.ES6/Redux: trả về một chức năng để xóa trình nghe sự kiện

Ông sau đó nói:

Có một thiếu phần quan trọng ở đây. Chúng tôi chưa cung cấp cách hủy đăng ký người nghe. Thay vì thêm một phương thức Unsubscribe chuyên dụng, chúng ta sẽ chỉ trả về một hàm từ phương thức Subscribe để loại bỏ người nghe này khỏi mảng của người nghe.

Vì vậy, mã ông sử dụng để thêm/xóa người nghe là:

const subscribe = (listener) => { 
    listeners.push(listener); 
    return() => { 
    listeners = listeners.filter(l => l !== listener); 
    }; 
}; 

Tôi loại hiểu rằng điều này cho phép bạn sử dụng một chức năng cho cả hai thêm/gỡ bỏ, và điều này có thể vì nếu bạn chuyển phương thức đăng ký tên của người nghe đã đăng ký, bộ lọc sẽ xóa nó, tôi làm không hiểu tại sao điều này trả về hàm mũi tên thay vì một mảng người nghe. Làm thế nào/khi nào chức năng trả về này sẽ được gọi?

Trả lời

7

Làm cách nào/khi nào hàm này trả về?

Chức năng này được gọi khi người nghe phải được loại bỏ. Khi chính xác điều này xảy ra phụ thuộc vào ứng dụng.

Invocation rất đơn giản:

const remove = subscribe(myListener); 
// later: 
remove(); 

Tôi không hiểu tại sao điều này trả về một chức năng mũi tên chứ không phải là một mảng của người nghe.

Điều đó sẽ cho phép bất kỳ người đăng ký nào gây rối với mảng người nghe hoặc yêu cầu mọi người đăng ký thực hiện cùng một logic hủy đăng ký.

+0

Chỉ muốn thêm rằng đây là một cách tiếp cận rất phổ biến. Ví dụ, hãy xem hàm AngularJS [$ scope. $ On()] (https://docs.angularjs.org/api/ng/type/$rootScope.Scope) hoạt động như thế nào. Nó trả về một hàm hủy đăng ký cho một người nghe. – Warlock

+0

Cảm ơn bạn, đây là một lời giải thích tốt và một mô hình khá mát mẻ mà tôi đã không nhìn thấy/nhận thấy trước đây! – HowlingFantods

+0

Nhưng tại sao không xác định một chức năng bỏ đăng ký và thành phần mà thực hiện người nghe có thể gọi store.unsubscribe (nghe). Có phải vì nó tách rời thành phần khỏi cửa hàng không? – sabman

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