読者です 読者をやめる 読者になる 読者になる

Volta 探検 (3): setTimeout

.NET

Volta のおかげでかなり久しぶりに JavaScript を触ってる気がします.5 年ぶりぐらい?
ASP.NET (風?) のプログラミングにいたっては初めての挑戦だったりしますが色々楽しいですね.
機会があれば使ってみようと思いつつ,ずっとその機会がないままだった setTimeout で 先日の FizzBuzz を書き直し.

using System;
using Microsoft.LiveLabs.Volta.Html;

namespace FizzBuzzVolta
{
    public partial class VoltaPage1 : Page
    {
        public VoltaPage1()
        {
            InitializeComponent();

            var button = new Button() { InnerText = "FizzBuzz!" };
            var input = new Input() { Value = "1000" };

            var para = new Paragraph()
            {
                button,
                new Span(){ InnerText = "upto: "},
                input,
            };

            Func<int, string> fizzbuzz = i =>
                {
                    if (i % 15 == 0) return "FizzBuzz";
                    else if (i % 5 == 0) return "Buzz";
                    else if (i % 3 == 0) return "Fizz";
                    else return i.ToString();
                };

            button.Click += () =>
            {
                int upto = 0;
                if( !int.TryParse(input.Value, out upto) ) return;

                this.Document.Body.Add(new Table(){new TableBody(){Id = "FizzBuzzTable" }});

                int fizzBuzzCounter = 1;
                HtmlEventHandler callback = null;
                callback = () =>
                    {
                        var tb = this.Document.GetById<TableBody>("FizzBuzzTable");
                        tb.Add(new TableRow()
                                {
                                    new TableCell() { InnerText = fizzBuzzCounter.ToString() },
                                    new TableCell() { InnerText = fizzbuzz(fizzBuzzCounter) }
                                });
                        ++fizzBuzzCounter;
                        if (fizzBuzzCounter < upto)
                        {
                            this.Window.SetTimeout(callback, 0);
                        }
                    };
                this.Window.SetTimeout(callback, 0);
            };

            this.Document.Body.Add(para);
        }
    }
}