手邊有一隻ASP.NET程式,呼叫時透過URL帶入不同日期,可執行特定的計算邏輯。在正常情境下會有排程每天傳入當天日期計算,在測試台上想強制重算某段期間的資料,需要跑迴圈不斷傳入不同日期執行。

處理這個需求,我最優先想到的策略是用Mini C# Lab寫幾行程式搞定。不過想想,有時需求可能發生在網頁的AJAX互動上,特別是整合別人所提供的API,當API規格限定一次只處理一筆,使用迴圈Hacking就成了簡單但有效的解決方案。決定把這個需求當成練習,用jQuery寫了以下的程式碼:

<html>
<head>
    <script src="jquery.js" type="text/javascript"></script>
    <script type="text/javascript">
        $(function () {
            //準備從1/1做到5/31
            var d = new Date(2011, 0, 1);
            var june = new Date(2011, 5, 1);
            //將待處理的日期放進Array中
            var jobQueue = [];
            while (d < june) {
                var yy = d.getFullYear();
                var mm = d.getMonth() + 1;
                if (mm < 10) mm = "0" + mm;
                var dd = d.getDate();
                if (dd < 10) dd = "0" + dd;
                //產生yyyy/MM/dd格式日期
                   jobQueue.push(yy + "/" + mm + "/" + dd);
                d.setDate(d.getDate() + 1);
            }
 
            var $body = $("body");
            function run() {
                //檢查是否還有待處理工具
                if (jobQueue.length > 0) {
                    s = jobQueue.shift();
                    $.post("DoSomething.aspx?date=" + s, {}, function (r) {
                        //顯示執行結果
     $body.append("<div>" + s + ":" + r + "</div>");
                        //使用setTimeout可調節連續執行的速度
      setTimeout(function () {
                            run();
                        }, 10);
                    });
                }
            }
            run();
        });
    </script>
</head>
<body></body></html>

運作原理是先將待處理的日期字串放進Array中(不免抱怨,連日期轉yyyy/MM/dd都要花一番手腳,Javascript內建函數的菜色實在單薄了點... ),另外跑一個run(),在Array未清空前,每次取出一筆日期,做為$.post()的URL參數(若用$.get()要小心Cache的問題)。另外,在$.post() Callback函數中,我加了setTimeout作為連續呼叫頻率的調節(曾遇過一直連發狂Call,API會生氣的案例 XD)。

練習完jQuery,忍不住還是要試一下若用C#怎麼寫?

using System;
using System.Net;
using System.Threading;
public class CSharpLab
{
    public static void Test()
    {
        DateTime d = new DateTime(2011, 1, 1);
        DateTime dEnd = new DateTime(2011, 5, 31);
        WebClient wc = new WebClient();
        while (dEnd.CompareTo(d) >= 0)
        {
            string s = wc.DownloadString(
                "httq://myserver/myapp/DoSomething.aspx?date" +
                d.ToString("yyyy/MM/dd"));
            Console.WriteLine(d + ":" + s);
            Thread.Sleep(10);
            d = d.AddDays(1);
        }
        Console.WriteLine("\nDone!");
    }
}

結論: C#才是我的真愛呀!


Comments

# by 阿尼

我怎麼覺得c#那邊好像變成無窮迴圈了,有少打一行code嗎?

# by Jeffrey

謝謝阿尼的細心指正,真的少了d = d.AddDays(1);,已補正!

Post a comment