关注的代码:
const vm = require('vm');
const message = require('./messaging.js');
const EventEmitter = require('events');
const addon = message.load('addon');
var obj = new addon.MyObject(10);
var sb = new addon.SandBox();
var out = 0;
obj.on('plused', (a)=> { console.log('plused:', a, out++);});
sb.on('added', (a)=> { console.log('added', a, out++);});
sb.add("obj1", obj);
sb.add("obj2", obj);
sb.add("console", console);
console.log(obj.value());
var script = new vm.Script("obj1.plusOne(); obj2.plusOne();");
for (var i = 0; i < 3; ++i) {
const context = new vm.createContext(sb);
script.runInContext(context);
}
console.log(obj.value());
plusOne
和add
函数通过messaging.js中的函数发出事件,该函数正在使用setImmediate
调用推迟。
对于对象sb
,从主上下文调用setImmediate
,对于对象obj
,从for循环中创建的上下文调用它。 / p>
毫无疑问,对于sb
,事件被触发,并在同一个上下文中处理。
对于obj
情况,事件是从主上下文以外的新上下文触发的,我认为处理程序应该在事件被发出的相同上下文中执行,因此它将无法访问到主要上下文中的对象out
。
但是代码运行良好,在这两种情况下,都会访问主上下文中的out
。它看起来setImmediate
的回调函数总是在主上下文上执行。
请解释为什么会这样,谢谢。
输出:
10
16
added obj1 0
added obj2 1
added console 2
plused: 11 3
plused: 12 4
plused: 13 5
plused: 14 6
plused: 15 7
plused: 16 8