Ни setInterval
, и setTimeout
не поддерживаются Jint, потому что они являются частью API-интерфейса Window в браузерах. с Jint, а не с браузером, у нас есть доступ к CLR, и, честно говоря, он гораздо более универсален.
Первый шаг заключается в реализации нашего таймера в стороне CLR, Вот очень простой таймер оберткой для встроенного INT System.Threading.Timer
класса:
namespace JsTools
{
public class JsTimer
{
private Timer _timer;
private Action _actions;
public void OnTick(Delegate d)
{
_actions +=() => d.DynamicInvoke(JsValue.Undefined, new[] { JsValue.Undefined });
}
public void Start(int delay, int period)
{
if (_timer != null)
return;
_timer = new Timer(s => _actions());
_timer.Change(delay, period);
}
public void Stop()
{
_timer.Dispose();
_timer = null;
}
}
}
Следующий шаг заключается в связывании из JsTimer
к JINT двигателя:
var engine = new Engine(c => c.AllowClr(typeof (JsTimer).Assembly))
Вот пример использования:
internal class Program
{
private static void Main(string[] args)
{
var engine = new Engine(c => c.AllowClr(typeof (JsTimer).Assembly))
.SetValue("log", new Action<object>(Console.WriteLine))
.Execute(
@"
var callback=function(){
log('js');
}
var Tools=importNamespace('JsTools');
var t=new Tools.JsTimer();
t.OnTick(callback);
t.Start(0,1000);
");
Console.ReadKey();
}
}
Существует расширение годовых ckage, который утверждает, что предлагает именно это и многое другое: https://github.com/fredericaltorres/Jint.Ex – Hannobo