我有三个js类:要导出的事件对象类,一个类具有emit函数,另一个类是构造函数中的侦听器。我有三个侦听器正在使用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
为[e1, e2, e3
,但实际输出为null
发布于 2019-07-21 09:29:07
如果在您进入事件处理程序时input
是正确的,但在setImmediate()
之后不是,那么在您能够使用它之前,一定是代码中的其他东西更改了数组。这是在异步代码中传递可变对象的危险。
为了保护自己不受此影响,您可以复制数组,这样其他人就不能更改它。
bus.on('event', (input) => {
// make copy of input so nobody else will change it
let inputCopy = input.slice();
setImmediate(() => {
function2(inputCopy);
});
}, this);
注意:如果您的数组包含对象,并且这些对象本身可能会被其他人更改,那么上面的副本不会保护您免受这种情况的影响。
您也可以通过在这里不使用setImmediate()
而只同步处理数组来避免这个问题。
https://stackoverflow.com/questions/57129151
复制相似问题