AJAX 导入数据时如何实时显示真实的进度?

代码掌控者 2011-05-11 04:16:33
最近碰到一个问题,用Jquery中的Ajax向数据库导入数据,由于数据量比较大,比较慢,页面好像死了一样,用户体验很不好,于是想向用户显示一个进度,我的思路是这样子:
写两个AJAX函数,第一个用于导入数据,同时将进度信息写到Session中,第二个每隔一秒种获取Session进度信息

function datasave(){
//调用getproess函数
getproess()

//导入数据
$.ajax({
........
});
}

function getproess(){
//获取进度信息
$.ajax({
........
});

//每隔1秒运行一次
setTimeout(getproess,1000);
}

但问题是getproess函数无法获取到Session的值,真是奇怪了,不知道哪里出了问题了,请大家指教!
...全文
2224 52 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
每当你访问一个页面,asp.net会为页面创建一个session集合,并把系统中属于当前会话的信息复制到这个集合中。当你在页面中为session集合增加值,此时并没有增加到asp.net系统中。
  • 打赏
  • 举报
回复
第一个页面如果不执行完,页面的session集合的值不会复制到asp.net系统为会话而保存的session集合中的。

你可以考虑使用Cache来传送临时数据。
xingdongfang 2011-06-26
  • 打赏
  • 举报
回复
我用过ASP.NET AJAX,我知道,如果在服务端要启用SESSION的话,必须有一个webmethod(enablesession=true)](我没有区别大小写),如果你没有用这个attribute,你的session是没有效的。

不知道你的服务端是使用什么技术的。如果是ASP.NET AJAX,不妨用这个试试。
  • 打赏
  • 举报
回复
IE浏览器的一个常识:一个页面通常只允许有两个线程,再多的请求就要排队等待了。

你可以试试其它浏览器(许多所谓“快捷”的浏览器是靠一下子启动一大堆线程而显得比IE快的),如果测试出来如此,就知道有些所谓的“解决方法”其实是一条思路了。
wang2392219 2011-05-14
  • 打赏
  • 举报
回复
zftow110 2011-05-14
  • 打赏
  • 举报
回复
写入TEXT文件,AJAX去读取这个文件获取最新进度,我的群生成这么做的。不过开文件夹读写权限
xingdongfang 2011-05-14
  • 打赏
  • 举报
回复
另外,如果想用进度条的话,也可以基于上面的思路来实现
this.Response.Write("<script lanaguage=javascript>callprocess(" + ((++index / total records)</script>");
this.Response.Flush();
xingdongfang 2011-05-14
  • 打赏
  • 举报
回复
我做过这样的例子。

不使用AJAX

先把数据加载进来这后,在aspx.cx里面写上:

this.Response.Bluffer=true;
this.Reponse.Clear();
//...在这里处理你的导入数据的代码,一定是一个foreach的循环

var index = 0;
foreach(var x inxxx)
{
//..asdfadf
this.Response.Write("我现在的是进度是XXXX,处理了第" + ((++)index).ToString());
this.Response.Flush();
}
showjim 2011-05-14
  • 打赏
  • 举报
回复
你的数据如果是一次性提交的话,数据传送完后才会运行到Page_Load,所以普通的方法是没用的。
一种方法是分次提交,进度精确度与次数相关。
一种方法是重写IHttpModule或IHttpHandle,自己处理接收Http流并记录状态。
O溺水的鱼0 2011-05-14
  • 打赏
  • 举报
回复
只要你存入都了session中,那么这个值在session失效之前肯定是可以获取到的。如果获取不到值,那么你可以把两个sessionId打印出来看看,看看是否是同一个session对象。
dengzhiwen2009 2011-05-14
  • 打赏
  • 举报
回复
用AjaxPro做,在后台直接获取Session或Cookie,返回需要的数据,页面上用JS调用后台方法,利用返回值制作真实进度条
ricksyz 2011-05-13
  • 打赏
  • 举报
回复
ajax是异步的,写入session的操作可能都还没有执行到,你读取session的ajax就读不到了
无影的灵魂 2011-05-13
  • 打赏
  • 举报
回复
曾用ASP+ajax弄过上传文件的进度条,楼主不要用SESSION,用APPLICATION吧,给每次上传手工设置唯一编码,然后定时取,很好解决。。上传完及时释放,性能同样OkK
wu8461113 2011-05-13
  • 打赏
  • 举报
回复
难道非要用 setTimeout,我上次用这个,在执行过程中,如果叠加了在setTimeout中执行的语句
,会出现冲突,你明显是在没读取进度条的时候就执行了下一段,建议把读取时间改变一下,这仅仅
是我的猜测。祝你成功.
笑道江湖情 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 wxr0323 的回复:]
引用 17 楼 yangshuquan 的回复:

to wxr0323(子夜):
感觉你的这个思路挺复杂的,而且要调用到微软AJAX的很多JS文件,很耗时间

真实的进度条。

要么就整个假的算了。。哈哈
[/Quote]
如果不是特别长时间的话,弄个假的也没什么关系。
whowhen21 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 zsy619 的回复:]
很简单的办法:
HideProgress(); //显示进度
$.post("Handler/ExportLoan.ashx",
{
ConfigName: ConfigName,
Random: GetRandomNum()
}, function (data) {
HideProgress(); //隐藏进度

});
[/Quote]
方法都是这样写的,但是,如果那个导入数据很长时间,这个是不会有回应的,一直等到导入结束。调试下就知道了
我爱程序 2011-05-13
  • 打赏
  • 举报
回复
很简单的办法:
HideProgress(); //显示进度
$.post("Handler/ExportLoan.ashx",
{
ConfigName: ConfigName,
Random: GetRandomNum()
}, function (data) {
HideProgress(); //隐藏进度

});
  • 打赏
  • 举报
回复
UpdateProgress
coder_s 2011-05-13
  • 打赏
  • 举报
回复
用 JUI 的 progressbar 可满足你的需求。
huolei11 2011-05-13
  • 打赏
  • 举报
回复
两个线程,一个插数据,一个控制这个线程。
加载更多回复(25)

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧