CODE-跑Javascript迴圈執行AJAX呼叫
2 | 13,964 |
手邊有一隻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);,已補正!