高手进++ web项目如何请求一次返回多次?
最近做了一个交换机管理的项目,有一个批设置要求实现读取、替换、统一设置功能,批设置弹出层中有多个选项和选择处理的开始行数和结束行数。如:用户在批设置中选择一个处理项,进行读取功能操作返回数据大量数据,我想让它一部分一部分的返回,如果处理完再返回后动态修改页面上的数据,因为数据量大就会很卡!! 注意:这个项目不适用分页功能
在其他论坛上看到一个解决方法是,用两个ajax请求,一个发送处理请求。另一个不停的去刷结果;问题是不知道怎么做,烦恼;
求高手解答????????
[最优解释]
代码已测试
前台代码:(为方便使用了jquery的ajax,你要测试请同样引入jquery文件,也可略微改动使用原生ajax)
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var url=document.URL;
///index:调用时直接传0,
///callback:所有数据获取完成后的回调函数,会获得结果字符串
///nowdata:调用时不要传递
function getdata(index,callback,nowdata)
{
if(!nowdata) var nowdata="";
$.get(
url+"?type=data&index="+index+"",
{},
function(str)
{
var backdata=eval(str);
nowdata+=backdata.str;
if(backdata.isEnd=="False")///若没有结束标志,递归调用发ajax请求
{
getdata(index+1,callback,nowdata);
}
else///结束标志为真,结束递归,调用回调函数,返回结果
{
if(callback) callback(nowdata);
return;
}
}
)
}
getdata(0,function(data){
alert(data);
var resobj=eval(data);//解析json字符串,得到数组
alert(resobj.length);
});
</script>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["type"] == "data")//判断是否是请求数据的ajax请求
{
int index =int.Parse(Request.QueryString["index"]);
if (index == 0)//若序号为0,说明是第一次请求,当调用函数获取数据
{
data = getData();
}
bool isEnd;
string nowStr = getNowData(index, 100,out isEnd);
Response.Write("({'str':""+nowStr+"",'isEnd':'"+isEnd.ToString()+"'})");
Response.End();
}
}
public static string data=string.Empty;
/// <summary>
/// 获得数据
/// </summary>
/// <returns></returns>
string getData()
{
StringBuilder str = new StringBuilder();
str.Append("[");
for (int i = 0; i < 100; i++)
{
str.Append("{'a':'a','b':'b'}");
if (i != 99)
str.Append(",");
}
str.Append("]");
return str.ToString();
}
/// <summary>
/// 返回本次请求应发送的字符串
/// </summary>
/// <param name="index"></param>
/// <param name="num"></param>
/// <param name="isEnd"></param>
/// <returns></returns>
string getNowData(int index,int num,out bool isEnd)
{
int nextNum = data.Length - index * num;
string result;
if (nextNum > num)
{
result = data.Substring(index * num, num);
isEnd = false;
}
else
{
result = data.Substring(index * num, nextNum);
isEnd = true;
}
return result;
}
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>无标题页</title>
</head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
var url=document.URL;
///callback1:每次请求成功的回调函数,获得本次请求的字符串和序号
///callback2:所有数据获取完成后的回调函数,会获得总的结果字符串
///index:调用时直接传0,
///nowdata:调用时不要传递
function getdata(callback1,callback2,index,nowdata)
{
if(!nowdata) var nowdata="";
$.get(
url+"?type=data&index="+index+"",
{},
function(str)
{
var backdata=eval(str);
nowdata+=backdata.str;
if(callback1)
{
callback1(backdata.str,index);//执行回调1,可以对本次请求结果进行处理
}
if(backdata.isEnd=="False")///若没有结束标志,递归调用发ajax请求
{
getdata(callback1,callback2,index+1,nowdata);
}
else///结束标志为真,结束递归,调用回调函数2,返回结果
{
if(callback2) callback2(nowdata);
return;
}
}
)
}
getdata(function(data){
alert(data);
},
function(data)
{
alert(data);
},0
);
</script>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>