2016-11-06 20 views
9

tôi xây dựng một dịch vụ hộp thoại xác nhận đơn giản (góc 2) với phương pháp này:Subject.complete() có hủy đăng ký tất cả người nghe không?

confirm(body?: string, title?: string): Subject<void> { 
    this.confirmation = new Subject<void>(); 
    // ... show dialog here... "are you sure?" 
    return this.confirmation; 
} 

_onYesClicked() { 
    // ... closing the dialog 
    this.confirmation.next(); 
    this.confirmation.complete(); 
} 

_onNoClicked() { 
    // ... closing the dialog 
    this.confirmation.complete(); 
} 

Cách sử dụng:

confirmationService.confirm().subscribe(() => alert("CONFIRMED")); 

Nếu ai đó sử dụng dịch vụ này, anh nhận được một đề (mà là một quan sát) trở lại và có thể "đăng ký()" với nó. Đăng ký được gọi khi "có" được nhấp và do đó xác nhận đã được đưa ra ...

Đây có phải là cách chính xác để thực hiện việc này không? Và quan trọng hơn ... sẽ gọi tới số

this.confirmation.complete(); 

hủy đăng ký người nghe đã đăng ký và do đó ngăn chặn bất kỳ tham chiếu kéo dài nào (rò rỉ bộ nhớ)?

+0

Tôi đã chỉnh sửa tiêu đề vì phương thức 'complete()' không phải là một phần của giao diện của Obervable. –

Trả lời

13

Nếu bạn muốn chắc chắn nó loại bỏ tất cả các nhà quan sát bạn có thể tự mình kiểm tra trong https://github.com/ReactiveX/rxjs/blob/master/src/Subject.ts#L82. Nó gọi complete() trên tất cả các Quan sát viên (Các nhà quan sát thường chỉ là các đối tượng câm thực hiện Observer interface) và sau đó đặt this.observers.length = 0;. Vì vậy, câu trả lời là có.

Cách tiếp cận của bạn hợp lệ, về cơ bản giống với Angular2 thường xuyên thực hiện với EventEmitter. Chỉ một điều bạn có thể cải thiện là bắt đầu sử dụng asObservable() khi phơi bày Subject s. Điều này sẽ ẩn thực tế rằng bạn đang sử dụng một Subject bên dưới và chỉ trả về một Observable thông thường. Bằng cách này, bạn không cho phép người dùng của mình tình cờ (hoặc từ sự hiểu lầm), hãy thử gọi next(), complete() hoặc error() trên số Subject của bạn.

Về rò rỉ bộ nhớ, điều này phải được xử lý bởi RxJS, vì vậy bạn không nên lo lắng về nó và nếu có vấn đề, các tác giả có thể sẽ nhận thấy nó trước bạn.

+0

Tôi cũng sẽ gọi lỗi() thay vì hoàn thành() khi người dùng nhấp vào Không. Hoặc tôi sẽ sử dụng Lời hứa thay vì Quan sát. Đó là BTW những gì các mod-bootstrap modals làm. –

+0

Hehehe ... đó là thiên tài, chỉ cần nhìn vào nguồn - điều đó làm cho tôi chắc chắn cảm thấy rất chắc chắn rằng không có tài liệu tham khảo được lưu giữ. Cũng khuyên tuyệt vời về "asObservable()" - Cảm ơn bạn! – Wolfgang

+0

@JBNizet Tôi nghĩ rằng việc nhấp vào "Không" không nhất thiết có nghĩa là lỗi nhưng đây là câu hỏi cho OP không phải cho tôi, tôi đoán vậy. – martin

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