“Trình phát sự kiện” là gì?


76

Duyệt qua http://microjs.com , tôi thấy rất nhiều thư viện được gắn nhãn "bộ phát sự kiện". Tôi thích nghĩ rằng tôi biết khá tốt về những điều cơ bản của ngôn ngữ Javascript, nhưng tôi thực sự không biết "trình phát sự kiện" là gì hoặc làm gì.

Co ai quan tâm dạy dô tôi chư? Nghe thú vị...

Câu trả lời:


60

Nó kích hoạt một sự kiện mà bất kỳ ai cũng có thể lắng nghe. Các thư viện khác nhau cung cấp các cách triển khai khác nhau và cho các mục đích khác nhau, nhưng ý tưởng cơ bản là cung cấp một khuôn khổ để phát hành các sự kiện và đăng ký chúng.

Ví dụ từ jQuery:

// Subscribe to event.
$('#foo').bind('click', function() {
    alert("Click!");
});

// Emit event.
$('#foo').trigger('click');

Tuy nhiên, với jQuery để tạo ra một sự kiện, bạn cần có một đối tượng DOM và không thể phát ra các sự kiện từ một đối tượng tùy ý. Đây là nơi mà bộ phát sự kiện trở nên hữu ích. Dưới đây là một số mã giả để giới thiệu các sự kiện tùy chỉnh (cùng một mẫu như trên):

// Create custom object which "inherits" from emitter. Keyword "extend" is just a pseudo-code.
var myCustomObject = {};
extend(myCustomObject , EventEmitter);

// Subscribe to event.
myCustomObject.on("somethingHappened", function() { 
    alert("something happened!");
});

// Emit event.
myCustomObject.emit("somethingHappened");

12
Đoạn cuối cùng của bạn sai, jQuery không hỗ trợ các sự kiện và khai báo tùy chỉnh. Ví dụ: jsfiddle.net/PzRtn
Rob W

@RobW Cảm ơn bạn đã chỉnh sửa. Tuy nhiên hạn chế của jQuery là nó yêu cầu một đối tượng jQuery / DOM để phát ra các sự kiện. Đúng không?
niaher

Tôi đã sửa câu trả lời. Vui lòng cho tôi biết nếu bạn vẫn thấy bất kỳ vấn đề nào. Cảm ơn bạn.
niaher

4
jQuery có thể làm các sự kiện mà không có một phần tử DOM, sử dụng $ ({})
Jack


21

Trong node.js, một sự kiện có thể được mô tả đơn giản như một chuỗi với một lệnh gọi lại tương ứng. Một sự kiện có thể được "phát ra" (hay nói cách khác là gọi lại tương ứng) nhiều lần hoặc bạn có thể chọn chỉ nghe lần đầu tiên nó được phát ra.

Thí dụ:-

var example_emitter = new (require('events').EventEmitter);
example_emitter.on("test", function () { console.log("test"); });
example_emitter.on("print", function (message) { console.log(message); });
example_emitter.emit("test");
example_emitter.emit("print", "message");
example_emitter.emit("unhandled");

> var example_emitter = new (require('events').EventEmitter);
{}
> example_emitter.on("test", function () { console.log("test"); });
{ _events: { test: [Function] } }
> example_emitter.on("print", function (message) { console.log(message); });
{ _events: { test: [Function], print: [Function] } }
> example_emitter.emit("test");
test //console.log'd
true //return value
> example_emitter.emit("print", "message");
message //console.log'd
true    //return value
> example_emitter.emit("unhandled");
false   //return value

Điều này thể hiện tất cả các chức năng cơ bản của một EventEmitter. Các on or addListenerphương pháp (về cơ bản phương pháp thuê bao) cho phép bạn chọn các sự kiện để quan sát và gọi lại để được gọi. Mặt khác, emitphương thức (phương thức xuất bản) cho phép bạn "phát ra" một sự kiện, khiến cho tất cả các lệnh gọi lại được đăng ký cho sự kiện đó 'kích hoạt', (được gọi).

Từ nguồn Bộ phát sự kiện là gì?


lời giải thích tốt đẹp về bài viết mà ban đầu không có ý nghĩa gì đối với tôi
Vass

4

Ví dụ đơn giản trong Node.js:

var EventEmitter = require('events').EventEmitter;
var concert = new EventEmitter;
var singer = 'Coldplay';

concert.on('start', function (singer) {
  console.log(`OMG ${singer}!`);
});

concert.on('finish', function () {
  console.log(`It was the best concert in my life...`);
});

concert.emit('start', singer);
concert.emit('finish');

1

Hãy xem xét một chức năng gọi lại-

function test(int a, function(){
     console.log("I am call-back function");
   }){
    console.log("I am a parent function");
 }

Bây giờ, bất cứ khi nào hàm cha được gọi trong một sự kiện (một lần nhấp vào nút hoặc bất kỳ kết nối nào, v.v.), trước tiên nó sẽ thực thi mã của nó, sau đó quyền điều khiển được chuyển cho hàm call-back. Bây giờ, bộ phát sự kiện là một đối tượng / phương thức kích hoạt một sự kiện ngay sau khi một số hành động diễn ra để chuyển cntrol đến hàm mẹ. Ví dụ- Máy chủ là một bộ phát sự kiện trong lập trình Node.Js. Nó phát ra sự kiện lỗi ngay sau khi máy chủ gặp lỗi, nó sẽ chuyển quyền điều khiển cho chức năng mẹ lỗi. Máy chủ phát ra một sự kiện kết nối ngay sau khi một ổ cắm được kết nối với máy chủ, sự kiện này sau đó kích hoạt hàm cha của getConnections, thực sự cũng lấy một hàm gọi lại làm đối số. Vì vậy, nó thực sự là một chuỗi, được kích hoạt khi một cái gì đó xảy ra bởi bộ phát sự kiện phát ra một sự kiện để bắt đầu một chức năng đang chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.