ВМ: 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)