2013-01-16 28 views
8

Tôi đã tạo một lớp javascript đơn giản bằng cách sử dụng kỹ thuật 'chức năng'. Trong lớp, tôi có trình nghe websocket, kích hoạt chức năng khi nhận được một tin nhắn nhất định. tôi có thể dễ dàng thêm một callback bên ngoài để nó như sauCách thêm nhiều cuộc gọi lại vào một phương thức javascript?

function MyClass() { 
    self = this; // to access main object from methods 

    // websocket definition 

    function websocketMessageInterpreter(message){ 
     if(message == "Hello!") onHelloMessageBase(); 
    } 

    function onHelloMessageBase(param){ 

    // call user defined callback 
    self.userDefinedCallback(param); 
    } 
    this.userDefinedCallback= function(param){}; //default empty callback 
} 

Bên ngoài tôi sử dụng điều này như

var myObject = new MyClass(); 
myObject.userDefinedCallback = function(){alert("Someone said hello!");}; 

Có một mô hình mà tôi có thể làm điều gì đó như thế này?

myObject.userDefinedCallback += function1; 
myObject.userDefinedCallback += function2; 

và có lẽ sau

myObject.userDefinedCallback -= function1; 
+0

bạn có thể viết [hàm lồng nhau] (http://stackoverflow.com/questions/7295634/javascript-nested-function) vào hàm gọi lại – Johnny000

Trả lời

11

Cách thông thường để làm điều này là để có một mảng của callbacks, và các phương pháp như addCallback(callback)removeCallback(callback) để cho người dùng của API thêm và loại bỏ callbacks.

addCallback về cơ bản là:

function addCallback(callback) { 
    if (this.callbacks.indexOf(callback) < 0) { 
     this.callbacks.push(callback); 
    } 
} 

removeCallback về cơ bản là:

function removeCallback(callback) { 
    var index; 
    if ((index = this.callbacks.indexOf(callback)) >= 0) { 
     this.callbacks.splice(index, 1); 
    } 
} 

Nếu bạn cần hỗ trợ các trình duyệt thực sự cũ như IE6 mà có thể không có Array#indexOf, kể từ khi bạn đang sử dụng jQuery, bạn có thể sử dụng jQuery.inArray để thay thế.

+1

Có phải 'toString()' được áp dụng cho các hàm hay cách bạn thực sự so sánh hai chức năng, nếu chúng giống nhau không? – Amberlamps

+1

@Amberlamps: Đó là so sánh nhận dạng đơn giản, giống như đối với bất kỳ đối tượng nào khác. –

+0

@FelixKling: Được rồi, và so sánh danh tính đó cũng hoạt động đối với các chức năng ẩn danh? – Amberlamps

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