首页 > 解决方案 > 向 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);

我除了inputto be [e1, e2, e3,但实际输出是null

标签: node.jsevents

解决方案


如果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()此处而仅同步处理数组来避免此问题。


推荐阅读