Node.js setImmediate v8 context

时间:2016-10-18 10:42:57

标签: node.js

关注的代码:

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());

plusOneadd函数通过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

0 个答案:

没有答案