簡體   English   中英

如何在JINT Javascript端創建計時器

[英]How to create timer on JINT Javascript side

我正在使用JINT( https://github.com/sebastienros/jint )開發一個C#項目,我需要在我的JS上創建一個計時器,這樣每次定時器時間設置結束時它都可以在我的javascript上執行一個函數。 我怎么能做到這一點? 我使用了setInterval或setTimeout函數,但似乎它們不是JINT的一部分,因為它基於ECMASCRIPT,並且這些函數不是本機的。

誰能告訴我怎么能這樣做?

謝謝!!

Jint不支持setIntervalsetTimeout ,因為它們是瀏覽器中Window API的一部分。 使用Jint而不是瀏覽器,我們可以訪問CLR,說實話,它更加通用。

第一步是在CLR端實現我們的Timer,這是一個非常簡單的內置int System.Threading.Timer類的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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM