有时jQuery的文档会让我感到愚蠢。
我有一个应用程序在服务器上使用PHP来处理多个订单的创建(有时超过一千个)。我试图找出如何使用该脚本(通过$ .ajax调用)通知UI其状态。
我理解$ .ajax中的.onprogress,.success和.complete元素,但是我找不到PHP脚本应该为每个事件类型提供数据的示例。
在老式的javascript中,使用ajax.readyState,您可以从脚本中获取PHP.echo()事件以进行进度,然后使用PHP.exit()事件来完成请求。
如何在$ .ajax世界中做到这一点?
非常感谢一只试图学习新技巧的老狗。
答案 0 :(得分:0)
想出蛮力的方式。
每次从服务器端回显()时,bundle都会以e.target.responseText的形式传递给onprogress处理程序。请注意,responseText会随着每个响应而持续增长,因此您需要一个客户端变量来跟踪其先前的长度:
var this_str, last_len = 0;
...
onprogress: function (e) {
this_str = e.target.responseText.substr(last_len);
...do something with this_str...
last_len = e.target.responseText.length;
}
...
如果结果是json,则需要解码this_str(而不是responseText)。这最适合使用不同的技术,因为根据服务器更新的频率,您的解析可能会过载。由于您正在发送json对象,因此整个responseText字符串是一系列json对象,由闭合和开放花括号"} {"分隔。所以把它分成几部分,并使用最新的:
var subtext, parts, json;
...
onprogress: function (e) {
parts = e.target.responseText.split('}{');
if (parts.length > 1) {
subtext = '{' + parts[parts.length - 1];
} else {
subtext = parts[0];
}
json = JSON.parse(subtext);
...
成功函数对json采用了类似的方法:
success: function (text) {
parts = text.split('}{');
if (parts.length > 1) {
subtext = '{' + parts[parts.length - 1];
} else {
subtext = parts[0];
}
json = JSON.parse(subtext);
...
请注意,随着事情的开始,会有一些无用的onprogress事件;一定要测试那些并忽略它们。
当您的服务器端函数终止或退出()时,您的success函数和onprogress函数都将收到完整的responseText字符串。如果你想要做一些不同的事情,记得要跟踪responseText中的最后一个字符串。