积极答复者
asp.net竞拍功能

问题
-
需求:后台设置好上架时间后,前台的剩余时间开始倒计时,这时候多个用户同时抢拍,每点1次增加20秒,最后没有人点击抢拍的时候,最后那个人变成领取人.
现在遇到的问题是,在本地测试开3个浏览器,IE10,Chrome,Firefox进行测试,倒计时到1秒的时候,点抢拍,会出现某个浏览器回滚倒计时,其它2个浏览器显示结束,请问如何解决?
代码如下:
aspx页面js:
<script type="text/javascript">
function SecKill(id)
{
$.post('./SecKill.ashx',{"id":id},function(data, status){
if(data=="nologin")
{
location.href="./login.aspx?myurl=seckill.aspx";
}
else if(data =="noscore")
{
alert("积分不够,请充值!");
}
else if(data =="faile")
{
alert("抢拍失败!");
}
else
{
var rsData = eval("(" + data + ")");
$("#person"+id)[0].innerHTML=rsData.person;
$("#price"+id)[0].innerHTML=rsData.price;
$("#settime"+id).attr("endTime",rsData.settime);
$("#jf")[0].innerHTML=rsData.score;
}
});
}
</script>通过link引用的js:
$(document).ready(function () {
updateEndTime();
});
function updateEndTime() {
//获取服务端时间
$.post("./GetServerDate.ashx", function (data) {
var date = new Date(data);
var time = date.getTime(); //当前时间距1970年1月1日之间的毫秒数
$(".settime").each(function (i) {
var endDate = this.getAttribute("endTime"); //结束时间字符串
var did = this.getAttribute("did");
//转换为时间日期类型
var endDate1 = eval('new Date(' + endDate.replace(/\d+(?=-[^-]+$)/, function (a) { return parseInt(a, 10) - 1; }).match(/\d+/g) + ')');
var endTime = endDate1.getTime(); //结束时间毫秒数
var lag = (endTime - time) / 1000; //当前时间和结束时间之间的秒数
if (lag >= 0) {
var second = Math.floor(lag % 60);
var minite = Math.floor((lag / 60) % 60);
var hour = Math.floor((lag / 3600) % 24);
var day = Math.floor((lag / 3600) / 24);
$(this).html(day + "天" + hour + "小时" + minite + "分" + second + "秒");
//在大于0的情况下,每次去检测有没有人进行竞拍
$.post('./GetKillPerson.ashx', { "id": did }, function (data) {
alert(data);
data = eval("(" + data + ")");
$("#person" + did).text(unescape(data.person));
if (lag < 4) {
$(".settime").css({ "color": "white", "background-color": "Red" });
}
else {
$(".settime").css({ "background-color": "white", "color": "Black" });
}
$("#settime" + did).attr("endTime", data.settime);
});
}
else if (lag <= 1) {
window.location.reload();
$(".settime").css({ "background-color": "white", "color": "Black" });
$(this).html("已结束");
$("#lock" + did)[0].href = "javascript:void(0);"
$("#lock" + did).removeClass("btn1");
$("#lock" + did).addClass("btn2");
clearTimeout(updateEndTime());
}
});
}
);
setTimeout("updateEndTime()", 1000);
}
答案
-
我觉得你在前台使用settimeout这个函数不提合适。你的发送请求只是局限于单个用户的时间限制。而对其他的用户的时间影响就很小。也就是说每个用户的得到反馈的时间请求并不是一致的。我觉得这个时间应该由后台决定比较好,不管是哪个用户都能同时获取到相同的时间。这种情况下需要的是服务器端会主动以异步的方式向客户端程序推送数据。这边有个相关推送方式的sample,我建议你可以去看下.
http://www.cnblogs.com/Yashull/archive/2013/04/09/3010523.html
希望对你有所帮助!
- 已标记为答案 Will ShaoMicrosoft employee, Moderator 2013年7月23日 1:18
-
每一秒发送一次请求同步服务器时间与本地时间。结果应该从服务器返回,本地输出结果,当然会出错的呀。
- 已标记为答案 Will ShaoMicrosoft employee, Moderator 2013年7月23日 1:18
全部回复
-
我觉得你在前台使用settimeout这个函数不提合适。你的发送请求只是局限于单个用户的时间限制。而对其他的用户的时间影响就很小。也就是说每个用户的得到反馈的时间请求并不是一致的。我觉得这个时间应该由后台决定比较好,不管是哪个用户都能同时获取到相同的时间。这种情况下需要的是服务器端会主动以异步的方式向客户端程序推送数据。这边有个相关推送方式的sample,我建议你可以去看下.
http://www.cnblogs.com/Yashull/archive/2013/04/09/3010523.html
希望对你有所帮助!
- 已标记为答案 Will ShaoMicrosoft employee, Moderator 2013年7月23日 1:18
-
每一秒发送一次请求同步服务器时间与本地时间。结果应该从服务器返回,本地输出结果,当然会出错的呀。
- 已标记为答案 Will ShaoMicrosoft employee, Moderator 2013年7月23日 1:18