CODE-跑Javascript迴圈執行AJAX呼叫

手邊有一隻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#才是我的真愛呀!

歡迎推文分享:
Published 01 June 2011 07:06 AM 由 Jeffrey
Filed under: ,
Views: 12,834



意見

# 阿尼 said on 01 June, 2011 01:12 AM

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

# Jeffrey said on 01 June, 2011 02:52 AM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<June 2011>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication