찾다

 >  Q&A  >  본문

node.js - nodejs removeListener 無法得到 listener

event.on("newListener", function (EventName, callback) {
    callback({on: EventName});
});
event.addListener("aaa", function (value) {
    console.log("我是注册时自动触发的" + value.on + "事件!");
});// 正常输出:我是注册时自动触发的 aaa 事件!

event.on("removeListener", function (EventName, callback) {
    callback({EventName: EventName});
});
var callbackName = function (value) {
    console.log("我是删除事件时自动触发的" + value.EventName + "事件!");
}
event.on("ddd", callbackName);
event.removeListener("ddd", callbackName);
// 报错!event.js:76 callback({EventName: EventName});
PHP中文网PHP中文网2781일 전1050

모든 응답(1)나는 대답할 것이다

  • 天蓬老师

    天蓬老师2017-04-17 11:33:13

    你到是把關機詞發上來啊!!!!!!!!!

    害得我自己查文檔,補全代碼,然後只爲了你不肯發上來的一句也是唯一重要的一句話:

    TypeError: undefined is not a function

    順便吐槽樓主的英語水平、代碼格式以及命名風格!!!!!

    也就是說 removeListener 事件的第二參數是 undefined。

    順便把代碼統一了風格,更正了命名,使與 http://nodejs.org/api/events.html 一致。

    var emitter = new (require('events').EventEmitter);
    
    emitter.on("newListener", function(event, listener) {
        // listener({event: event});
    });
    emitter.on("aaa", function(event) {
        console.log("Fire on register: " + value.event);
    });// Fire on register: aaa
    
    emitter.on("removeListener", function(event, listener) {
        console.log(event);
        listener({event: event});
    });
    function onddd(event) {
        console.log("Fire on remove: " + event.event);
    }
    emitter.on("ddd", onddd);
    // emitter.removeListener("ddd", onddd);
    emitter.removeAllListeners("ddd");
    

    這段代碼可以正常運行,原因是

    emitter.on("newListener", function(event, listener) {
        // listener({event: event});
    });
    

    當中的函數調用被註釋掉了。

    因爲

    emitter.on("removeListener", function(event, listener) {
        console.log(event);
        listener({event: event});
    });
    

    本身也會導致 newListener 被調用。

    所以,代碼改成如下即可:

    var emitter = new (require('events').EventEmitter);
    
    emitter.on("removeListener", function onRemoveListener(event, listener) {
        listener({event: event});
    });
    
    emitter.on("ddd", function onDdd(event) {
        console.log("Fire on remove: " + event.event);
    });
    
    emitter.on("newListener", function onNewListener(event, listener) {
        listener({event: event});
    });
    emitter.on("aaa", function onAaa(event) {
        console.log("Fire on register: " + event.event);
    });
    
    emitter.removeAllListeners("ddd");
    

    實際上,on 和 addListener 是同樣的,因此把 addListener 改成 on 並不會逃開 newListener。

    樓主學編程卻不看官方文檔,還不如我們這些只看官方文檔卻不學編程的菜鳥。。。

    회신하다
    0
  • 취소회신하다