2013-04-10 6 views
5

Đọc tài liệu tại số http://nodejs.org/api/domain.html làm cho nó hơi mơ hồ: "cố gắng hết sức để xóa bất kỳ và tất cả IO được liên kết với tên miền". Nó đề cập rằng bộ đếm thời gian được tắt máy, mà không phải là chính xác IO. Nó sẽ rất tốt đẹp để biết danh sách toàn diện của những thứ domain.dispose làm. Có ai có danh sách đó không?Chính xác domain_ispose() làm gì trong nodejs? Có móc nào không?

Ngoài ra, có cách nào để móc vào chức năng đó - tức là cho phép một số mã tùy chỉnh dọn dẹp được gọi khi domain.dispose() được chạy không?

Trả lời

4

Chức năng hủy bỏ gọi hàm thoát và hủy bỏ, loại bỏ tất cả người nghe, xóa tất cả trình xử lý lỗi và cố gắng tiêu diệt tất cả thành viên của miền. Chức năng kiểm tra nếu tên miền có một phụ huynh, và nếu nó có, sau đó nó được lấy ra khỏi tên miền. Tên miền sau đó được đặt cho bộ sưu tập rác và được đánh dấu là đã được xử lý.

Từ các tài liệu Node:

Khi tên miền được xử lý sự kiện dispose sẽ phát ra.

Tôi sẽ đi sâu hơn về chủ đề, nhưng nguồn nút đã được chú thích một cách độc đáo.

Bộ hẹn giờ bạn đang nói đến sẽ ở đây, nơi các thành viên của miền đang được lặp lại thông qua.

this.members.forEach(function(m) { 
    // if it's a timeout or interval, cancel it. 
    clearTimeout(m); 
}); 

Dưới đây là từ Node source:

Domain.prototype.dispose = function() { 
    if (this._disposed) return; 

    // if we're the active domain, then get out now. 
    this.exit(); 

    this.emit('dispose'); 

    // remove error handlers. 
    this.removeAllListeners(); 
    this.on('error', function() {}); 

    // try to kill all the members. 
    // XXX There should be more consistent ways 
    // to shut down things! 
    this.members.forEach(function(m) { 
    // if it's a timeout or interval, cancel it. 
    clearTimeout(m); 

    // drop all event listeners. 
    if (m instanceof EventEmitter) { 
     m.removeAllListeners(); 
     // swallow errors 
     m.on('error', function() {}); 
    } 

    // Be careful! 
    // By definition, we're likely in error-ridden territory here, 
    // so it's quite possible that calling some of these methods 
    // might cause additional exceptions to be thrown. 
    endMethods.forEach(function(method) { 
     if (typeof m[method] === 'function') { 
     try { 
      m[method](); 
     } catch (er) {} 
     } 
    }); 

    }); 

    // remove from parent domain, if there is one. 
    if (this.domain) this.domain.remove(this); 

    // kill the references so that they can be properly gc'ed. 
    this.members.length = 0; 

    // finally, mark this domain as 'no longer relevant' 
    // so that it can't be entered or activated. 
    this._disposed = true; 
}; 
+1

Vì vậy, trông giống như "vứt bỏ" sự kiện có thể là móc tôi đã tự hỏi về. Có vẻ lạ họ không kiểm tra xem các thành viên là một thời gian chờ trước khi họ sử dụng clearTimeout trên đó. Có vẻ như sai lầm là họ giấu các ngoại lệ không bị bắt buộc từ các phương thức endMethods mà họ chạy. Tập hợp những thứ trở thành "thành viên miền" là gì? Có cách nào để làm cho các đối tượng tùy chỉnh trở thành một thành viên miền? Nguồn không rõ ràng về điều đó. –

+0

Vâng, những phương pháp đó không có vẻ rất sạch sẽ, mặc dù tôi không phải là một coder rất có kinh nghiệm vì vậy tôi không biết tốt hơn nhiều. Tôi có một câu hỏi - bạn đang nói về loại đối tượng tùy chỉnh nào? Thành viên là bất kỳ loại 'EventEmitter' nào, vì các miền được sử dụng cụ thể xử lý nhiều hoạt động I/O như một nhóm duy nhất. – hexacyanide

+0

Các đối tượng tùy chỉnh tôi đang nói là thực sự bất cứ điều gì bạn có thể nghĩ đến. Một ví dụ là một số mô-đun để xử lý giao tiếp TCP trên một số giao thức độc quyền. Có thể có một số thông báo cụ thể được mong đợi bởi giao thức trong trường hợp lỗi mà bạn muốn gửi trước khi chết thông qua vứt bỏ(). Nó sẽ được tốt đẹp để có thể chắc chắn rằng công cụ tùy chỉnh của bạn chỉ là sạch sẽ dùng một lần như chức năng IO lõi và muốn. –