node.js - 向 node.js 事件库中的异步侦听器发送时如何修复空参数?
问题描述
我有三个 js 类:正在导出的事件对象类,一个具有发射功能的类,另一个类是构造函数中的侦听器。我有三个监听器正在使用它setImmediate()
来使其异步。第一个侦听器能够正确获取参数,但不能正确获取其他两个。
我尝试在回调之前将其打印出来setImmediate()
,并且能够看到正确的参数。
bus.on('event', (input) => {
setImmediate(() => {
function(input); //parameter are not null here
});
}, this);
bus.on('event', (input) => {
//console.log(input) when printing the input here, I can see the values
setImmediate(() => {
function2(input); //null
});
}, this);
bus.on('event', (input) => {
setImmediate(() => {
function3(input);
});
}, this);
我除了input
to be [e1, e2, e3
,但实际输出是null
解决方案
如果input
在您进入事件处理程序时是好的,但不是 after setImmediate()
,那么您的代码中的其他内容必须在您能够使用它之前更改数组。这是在异步代码中传递可变对象的危险。
为了保护自己免受这种情况的影响,您可以制作数组的副本,以便其他人无法更改它。
bus.on('event', (input) => {
// make copy of input so nobody else will change it
let inputCopy = input.slice();
setImmediate(() => {
function2(inputCopy);
});
}, this);
注意:如果您的数组包含对象并且这些对象本身可能会被其他人更改,那么上面的副本不会保护您免受这种情况的影响。
您也可以通过不使用setImmediate()
此处而仅同步处理数组来避免此问题。
推荐阅读
- java - Java - 设置期间
- java - 如何在java中将base16转换为base 64,反之亦然?
- java - 澄清新的JVM内存参数InitialRAMPercentage和MinRAMPercentage的含义
- docker - 使用带有自定义挂载点的 docker 卷创建卷
- php - Dockerfile 在 `docker-compose up -d` 上没有按预期构建
- mongodb - 查找数组中的最大元素
- ms-word - 基于模板创建 MS Word 文档,使用用户提供的值更改其特定部分
- reactjs - 开玩笑模拟反应上下文
- intellij-idea - 如何从 IntelliJ 中排除方法完成?
- jquery - 如何使用 .each 使用保存在 var 中的 html 代码并使用 jQuery 在标签上过滤它