#node.js
#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());
Функции plusOne
и add
генерируют события через функцию в messaging.js , который откладывается с помощью setImmediate
call .
Для объекта sb
setImmediate
вызывается из основного контекста, а для объекта obj
вызывается из контекста, созданного в цикле for .
Нет сомнений, что for 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