搜尋

首頁  >  問答  >  主體

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中文网2778 天前1046

全部回覆(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
  • 取消回覆