ВМ: setTimeout не работает в браузере vm.runInNewContext

Я выполняю сценарий JS, используя модуль vm в браузере, как показано ниже.

vm.runInNewContext(codeToEval, sandboxObject);

setTimeout, setInterval и другие встроенные методы интервала не работают, даже если я выставляю их в sandboxObject, созданном с использованием vm.createContext({setTimeout})

console.log('start');
setTimeout(()=> {
     console.log('hello timeout');
 }, 2000);

 console.log('end');

выход:

start
end

Следует отметить, что когда я добавляю.bind(это), то время ожидания срабатывает и прерывается в этой строке, говоря, что.bind не является функцией.

console.log('start');
setTimeout(()=> {
     console.log('hello timeout');
 }, 2000).bind(this);

 console.log('end');

выход:

start
hello timeout
// and an error in console saying setTimeout(...).bind is not a function
// and end is not printed

Chrome 70

Платформа Ubuntu 18.04

V8

1 ответ

Помещать setTimeoutи другие контекстные зависимости в sandboxObject и выполнить такой код

      let executionContext = {
  setTimeout,
}
vm.createContext(executionContext);
vm.runInContext(code, executionContext)
Другие вопросы по тегам