使用mitt.emit()报错TypeError: n2 is not a function的修复方案咨询
修复 mitt.emit() 报错 "TypeError: n2 is not a function" 的方案
排查及解决步骤
检查事件订阅的回调类型
这个报错基本是因为setData事件的订阅列表里混进了非函数值。mitt会挨个执行订阅该事件的回调,只要有一个不是函数,就会触发这个错误。
去查所有写了bus.on('setData', ...)的代码,确认传进去的都是函数,别把对象、字符串这类普通值当成回调传了。确保事件总线实例是同一个
触发事件的bus和订阅事件的bus必须是同一个实例。如果是跨模块导入,别在多个地方重复执行const bus = mitt()创建新实例——不然订阅和触发不在同一个总线里,甚至可能把原有实例的属性冲掉,导致异常。核对事件名拼写
确认emit的setData和所有on里的事件名完全一致,大小写、字符都不能错。比如订阅的是小写d的setdata,触发的是大写D的setData,要么匹配到错误的订阅项,要么找不到正确回调,都可能引发这个报错。清理无效订阅
如果是组件场景,组件卸载时记得用bus.off('setData', 对应的回调)移除订阅。要是没清理,组件卸载后残留的无效引用可能在触发时出错。要是不确定具体回调,临时用bus.all.clear()清空所有订阅(注意别影响其他正常事件)。直接打印订阅列表定位问题
在bus.emit之前加一行代码打印订阅者:console.log(bus.all.get('setData')); bus.emit('setData', data);从控制台输出里能直接看到所有订阅
setData的内容,找到那个非函数的项,对应去改代码就行。
内容的提问来源于stack exchange,提问作者pu pu
相关产品推荐
相关产品推荐

