为何绑定unhandledRejection事件直接传函数调用会报ReferenceError?
为什么两种事件监听写法会有不同结果?
嘿,这个问题本质是要搞懂函数引用和立即调用函数的区别,我来给你讲明白:
第一种写法出错的原因
当你写:
process.on('unhandledRejection', logPromiseException(error, promise));
你其实是立刻执行了logPromiseException函数,然后把它的返回值当作回调传给process.on。但此时error和promise这两个变量根本不存在——它们是事件触发时才会被Node.js传入的参数,所以直接抛出ReferenceError。就算这两个变量存在,你传递的也不是事件需要的“回调函数”,而是函数执行后的结果,这完全不符合事件监听的逻辑,因为事件监听需要的是一个函数引用,等事件触发时再去调用它。
第二种写法正常的原因
而箭头函数的写法:
process.on( 'unhandledRejection', (error, promise) => logPromiseException(error, promise) );
这里你传给process.on的是一个箭头函数的引用,而不是立即执行它。当unhandledRejection事件触发时,Node.js会自动调用这个箭头函数,并把事件产生的error和promise参数传递进去。接着箭头函数再调用你的logPromiseException,把接收到的参数原封不动传过去,完美契合需求。
额外的简洁写法
其实还有更清爽的写法:如果你的logPromiseException函数的参数顺序和unhandledRejection事件回调的参数顺序完全一致(第一个是error,第二个是promise),那你可以直接传递函数本身,不用箭头函数包裹:
process.on('unhandledRejection', logPromiseException);
这样Node.js触发事件时,会自动把error和promise传给logPromiseException,效果和箭头函数写法完全一样,代码还更简洁~
内容的提问来源于stack exchange,提问作者webstackdev
相关产品推荐
相关产品推荐

