Node.js Установите промежуточный контекст версии 8

#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